我正在尝试使用 swift 构建我的第一个 iOS 应用程序。我被困在一个 segue 中,我想将行索引路径提供给下一页,但索引路径是“optional(0)”而不是“0”。有谁知道为什么?在代码中,有一个打印发送器。那个说“可选(0)”变量“viewController.passedValue”设置为0,真正的代码在注释后面
有谁知道为什么它给出“Optional(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")
}
最佳答案
你在打电话
performSegueWithIdentifier("DetailSegue", sender: indexPath.row)
然后,iOS 调用您的 prepareForSegue
,其中 sender 被定义为 AnyObject?
,即可选的 AnyObject
:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
...
}
因此,当您打印 sender
时,它是可选的,因此会通知您。如果您不想要可选的,您可以将其解包(强制解包或更好的可选绑定(bind))。
--
不过,顺便说一句,将 indexPath.row
存储在那里是对 sender
的误用。正如 performSegueWithIdentifier
的文档所说,sender
是:
The object that you want to use to initiate the segue. This object is made available for informational purposes during the actual segue.
但是 indexPath.row
不是启动 segue 的对象( TableView 单元格是)。因此,我建议不要使用 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
,而只是将您从 Storyboard 的单元格原型(prototype)直接转到 NewsDetailViewController
场景.如果你真的想以编程方式进行 segue,你可以这样做,但这不是必需的。但我不建议使用 sender
来表示 indexPath.row
,而是使用触发 segue 的 UI 控件。
关于ios - swift 索引路径=可选(0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33552562/