2015-11-05 51 views
2

我想用swift构建我的第一个iOS应用程序。我被困在一个segue,我想把行indexpath放到下一页,但是indexpath是“可选(0)”而不是“0”。有谁知道为什么?在代码中,有一个打印发件人。那个说“可选(0)”变量“viewController.passedValue”设置为0,真正的代码是在它后面的评论Swift indexpath =可选(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

因为它是一个可选的,你可以在这里阅读更多关于它:http://www.appcoda.com/beginners-guide-optionals-swift/ –

回答

1

要调用

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

然后,iOS的呼唤你的prepareForSegue,其中发送者被定义为AnyObject?,即一个可选的AnyObject

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

因此,当您打印sender,这是一个可选的,从而通知你这样的。如果你不想要可选的,你可以解开它(或者强制解包,或者更好的是可选绑定)。

-

顺便说一句,虽然,它是一个sender滥用是存储indexPath.row那里。正如performSegueWithIdentifier的文档所述,sender是:

要用来启动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在所有的替代,只是直接表示从故事板的电池原型你SEGUE到NewsDetailViewController现场。如果你真的想以编程的方式继续下去,你可以这样做,但这不是必须的。但我不会建议使用sender来表示indexPath.row,而是触发该segue的UI控件。

+0

谢谢,代码是80%由我的老师提供,我会推荐这段代码给他;) – DutchProgrammer