我的swift类中有一个名为ViewController的segue设置,我从tableView 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?())
从我的tableView 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,我也尝试了来自Calling segue programatically not working和Preparing for segue in embedded tableView in Swift的答案。这两个答案都没有用。
答案 0 :(得分:1)
如果我理解正确,你就是在呼叫prepareForSegue()
。你不应该,这是自动调用的。
你应该做的是调用performSegueWithIdentifier(identifier: String, sender: AnyObject?)
。这会触发segue调用,该调用会自动执行prepareForSegue()
。
identifier
参数是您从IB设置的参数:选择segue并查看属性检查器。
除此之外,@ AnthonyKong的答案是一种更安全的方式来处理选项(在这种情况下是一个segue) - 确保不会抛出运行时异常。
<强>附录强>
查看您更新的问题,特别是didSelectRowAtIndexPath
的实施。最后两行:
let vc : AnyObject! = self.storyboard.instantiateViewControllerWithIdentifier("Homework")
self.showViewController(vc as UIViewController, sender: vc)
是多余的 - 如果执行segue,将实例化目标视图控制器,因此您不必手动执行。删除这些行。
答案 1 :(得分:0)
你应该这样做:
if let svc = segue!.destinationViewController as? Homework {
svc.subject = subject_name
}
这是因为你可能会通过其他没有家庭作业的segue作为desination VC