Segue.destinationViewController 设置为 sourceViewController 的值

Segue.destinationViewController is set to value of sourceViewController

我正在学习 iOS,因为我编写了一个应用程序,该应用程序使用 UITableViewController 和核心数据来显示项目列表,另一个视图控制器也使用核心数据来配置各种附加属性未显示在 table 视图中。

UITableViewController 的导航栏中的一个按钮可以转到另一个视图,让我可以设置各种详细信息。这是使用故事板 "Show Detail" segue 完成的,并且工作正常。

我想使用 UITableViewCell 中的辅助操作按钮转至同一个详细视图控制器,因此我在故事板中创建了另一个 "Show Detail" 转场,将附件详细按钮连接到详细视图控制器(即:与导航栏中的按钮相同的 segue)

令人困惑的是,当我在 运行 时单击详细信息附件按钮时,什么也没有发生,并且从未调用过 prepareForSegue。

UITableView 单元格样式是副标题,我已将其配置为具有详细信息附件操作。但是,除非我特别添加,否则不会显示附件按钮:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: Storyboard.reuseID)
        let tone = toneTable[indexPath.row]
        cell.textLabel!.text = tone.valueForKey("toneName") as? String          
        cell.detailTextLabel!.text = tone.valueForKey("toneDescription") as? String
        cell.accessoryType = UITableViewCellAccessoryType.DetailButton
    return cell

终于放弃了,自己调用prepareForSeque:

    override func tableView(tableView: UITableView, accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath) {
        let tone = toneTable[indexPath.row]
        self.performSegueWithIdentifier("ShowToneDetail", sender: tone)
    }

(我使用 sender 参数作为传递 NSManagedOject 的方便位置)

现在,prepareForSegue 被调用,但是如果我在 prepareForSegue 中放置一个断点,我会看到 segue.destinationViewController 指向源视图控制器,而不是目标视图控制器。这很不幸,因为我想将一些值传递给 destinationViewController 的新实例。

有趣的是,segue 确实正确地实例化了 destinationViewController,并将控制权传递给它。

但是,我不明白发生了什么。我不知道为什么我必须自己调用 prepareForSeque,我也不知道为什么 segue 的 destinationViewController 设置不正确。

我做错了什么?

ps:这只是我的看法,还是 XCode 不如 Eclipse 等其他 IDE 成熟?

您以错误的方式创建了单元格。您应该使用 dequeueReusableCellWithIdentifier:forIndexPath: 使用您在情节提要中设置的标识符使单元格出列。通过按照您的方式进行操作,您直接实例化了一个单元格,该单元格 "knows" 与情节提要中您添加了详细信息披露按钮的单元格或您所做的 segue 无关。

我不知道为什么 segue.destinationViewController 会指向源代码视图控制器。我的猜测是它没有,也许你的控制器 类 搞混了。