我正在尝试使用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")
}
答案 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控件。