我的swift类中有一个名为ViewController的segue设置,我从表中调用View didSelectRowAtIndexPath。我正在我的segue 中使用此代码
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
var svc = segue!.destinationViewController as Homework;
svc.subject = subject_name
}
告诉它将一个名为subject的变量(像这样声明var subject:NSString!
)设置为名为subject_name的变量。然后,我使用以下代码prepareForSegue(UIStoryboardSegue(), sender: AnyObject?())
从表View didSelectRowAtIndexPath中调用它。
这是我的didSelectRowAtIndex
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
println("You selected cell #(indexPath.row)!")
let indexPath = tableView.indexPathForSelectedRow();
var currentCell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell
println(currentCell.textLabel!.text)
subject_name = currentCell.textLabel.text
// // Showing new storyboard
performSegueWithIdentifier("Homework", sender: self)
let vc : AnyObject! = self.storyboard.instantiateViewControllerWithIdentifier("Homework")
self.showViewController(vc as UIViewController, sender: vc)
}
但当我运行该应用程序并单击表视图单元格时,我会收到以下错误:"致命错误:在打开可选值时意外发现nil",绿色箭头指向var svc = segue!.destinationViewController as Homework;
。我在另一个应用程序上测试了完全相同的代码,除了点击按钮时调用segue,效果非常好,我还尝试了Swift中的Calling segue programally not working和Preparing for segue in embedded tableView中的答案。这两个答案都不起作用。
如果我理解正确,那么您正在调用prepareForSegue()
。你不应该,这是自动调用的。
您应该调用performSegueWithIdentifier(identifier: String, sender: AnyObject?)
。这会触发一个segue调用,该调用会自动执行prepareForSegue()
。
identifier
参数是您在IB中设置的参数:选择segue并查看属性检查器。
除此之外,@AnthonyKong的答案是一种更安全的处理选项(在本例中为segue)的方法,可以确保不会引发运行时异常。
附录查看您的最新问题,特别是didSelectRowAtIndexPath
的实施情况。最后2行:
let vc : AnyObject! = self.storyboard.instantiateViewControllerWithIdentifier("Homework")
self.showViewController(vc as UIViewController, sender: vc)
是冗余的——如果执行segue,它将实例化目标视图控制器,因此不必手动执行。拆下这些管路。
您应该这样做:
if let svc = segue!.destinationViewController as? Homework {
svc.subject = subject_name
}
这是因为你可能会通过其他没有作业作为设计VC 的分段