Swift:调用时Segue错误

时间:2014-10-13 19:35:40

标签: swift segue viewcontroller

我的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 workingPreparing for segue in embedded tableView in Swift的答案。这两个答案都没有用。

2 个答案:

答案 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