通过navigationController传递数据的segue

41
我正在尝试将数据从一个视图控制器推送到另一个视图控制器。我已将一个视图控制器连接到另一个视图控制器的导航控制器,然后将标识符设置为“showItemSegue”。这两行代码出现错误:
var detailController = segue.destinationViewController as ShowItemViewController
detailController.currentId = nextId!

图像说明:

输入图像描述

代码:

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {


    nextId = itemArray?.objectAtIndex(indexPath.row).objectForKey("objectId") as? NSString

    self.performSegueWithIdentifier("showItemSegue", sender: self)

}


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

    if (segue.identifier == "showItemSegue") {
        var detailController = segue.destinationViewController as ShowItemViewController
        detailController.currentId = nextId!
    }

}

请发布完整的错误信息。 - Robotic Cat
1个回答

77

转场的目标视图控制器是UINavigationController。你需要询问它的顶部视图控制器以获取实际的目标视图控制器:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showItemSegue" {
        let navController = segue.destination as! UINavigationController
        let detailController = navController.topViewController as! ShowItemViewController
        detailController.currentId = nextId!
    }
}

谢谢,这个解决方案似乎在Swift 3中运行良好。 - mic
太棒了!这对我处理嵌入在导航控制器中的模态对话框非常有帮助,而该导航控制器没有可见的导航栏,以便在下一个跳转的视图控制器中拥有导航栏(+返回按钮)。由于设置相当复杂,我有点紧张.. 但它运行良好 :) - Colibri
在尝试了一下之后,我发现如果你在故事板上在两个视图控制器之间创建segue并绕过导航控制器,那么问题中的代码仍然可以正常工作,并且你仍然可以在按钮栏中看到返回按钮。如果你在视图控制器和导航控制器之间创建segue,则@vacawama提供的答案完美地解决了问题,并且在按钮栏中不会提供返回按钮。这可能只是个人喜好的问题。 - Scooter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接