【问题标题】:Segue.destinationViewController is set to value of sourceViewControllerSegue.destinationViewController 设置为 sourceViewController 的值
【发布时间】:2015-04-13 22:38:59
【问题描述】:

我正在学习 iOS,因为我编写了一个使用 UITableViewController 和 Core Data 来显示项目列表的应用程序,以及另一个也使用 Core Data 来配置各种附加属性的视图控制器,这些属性在表格视图。

UITableViewController 导航栏中的一个按钮连接到另一个视图,让我可以设置各种细节。这是使用情节提要“显示细节”segue 完成的,而且效果很好。

我想使用 UITableViewCell 中的辅助操作按钮来连接到同一个细节视图控制器,所以我在故事板中创建了另一个“显示细节”序列,将辅助细节按钮连接到细节视图控制器(即:与导航栏中的按钮相同的segue)

令人困惑的是,当我在运行时单击详细附件按钮时,什么也没有发生,并且永远不会调用 prepareForSegue。

UITableView 单元格样式是 Subtitle,我已将其配置为具有 Detail 辅助操作。但是,除非我特别添加,否则不会显示附件按钮:

    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 成熟?

【问题讨论】:

    标签: ios swift uistoryboardsegue


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复!有趣的是,当我切换到 tableView.dequeueReusableCellWithIdentifier 时,单元格忘记了它在情节提要中分配的样式,并且既没有 detailTextLabel 也没有显示附件。
    • 当我查看调试器的实例变量时,segue.destinationViewController 不正确(我会在此处附上屏幕截图,但看起来“添加注释”字段中不允许这样做)。但是,我可以成功地将其转换为 destinationViewController 类,因此我将其归结为 XCode 异常。
    • @Andromeda 那可能是;调试器有时会给出虚假的结果。您可以在使用po segue.destinationViewController 进行调试时检查它,或者将其登录到 prepareForSegue。
    • True - 调试器默认类型为当前视图控制器,但类型转换后就好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 2018-11-11
    相关资源
    最近更新 更多