Swift indexpath = optional(0)

时间:2015-11-05 18:55:21

标签: ios xcode swift

我正在尝试使用swift构建我的第一个iOS应用程序。我被困在一个segue,我想将行索引路径提供给下一页,但索引路径是"可选(0)"而不是" 0"。有谁知道为什么?在代码中,有一个打印发件人。那个说"可选(0)"变量" viewController.passedValue"设置为0,真实代码在评论

后面

有谁知道它为什么会给出"可选(0)"?

代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let viewController = segue.destinationViewController as! NewsDetailViewController
    print(String(sender))
    viewController.passedValue = 0 // sender as! int
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    performSegueWithIdentifier("DetailSegue", sender: indexPath.row)
    print("HIER")
}

1 个答案:

答案 0 :(得分:1)

您正在致电

performSegueWithIdentifier("DetailSegue", sender: indexPath.row)

然后,iOS正在呼叫您的prepareForSegue,其中发件人被定义为AnyObject?,即可选AnyObject

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    ...
}

因此,当您打印sender时,它是可选的,因此会通知您。如果您不想要可选项,您可以打开它(强制解包或更好的可选绑定)。

-

但是,除此之外,将sender存储在indexPath.row是误用的。正如performSegueWithIdentifier的文档所述,sender是:

  

要用于启动segue的对象。在实际的segue期间,此对象可用于提供信息。

indexPath.row不是启动segue的对象(表视图单元格)。因此,我建议不要使用sender来保留indexPath.row。更常见的模式是

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let destination = segue.destinationViewController as? NewsDetailViewController, let row = tableView.indexPathForSelectedRow?.row {
        destination.passedValue = row
    }
}

这样做的另一个好处就是为您提供了不定义didSelectRowAtIndexPath的替代方案,只需将故事板的单元格原型直接表示为NewsDetailViewController场景。如果您真的想以编程方式进行segue,那么您可以这样做,但这不是必需的。但我不建议使用sender来表示indexPath.row,而是使用触发segue的UI控件。