Swift: Segue(modal) 到嵌入另一个导航控制器的 TableViewController

Swift: Segue(modal) to a UITableViewController which embeded in antoher navigation controller

背景:我想显示从 UITableViewController(A) 到 UITableViewController(B) 的模态转场,但我想要向 "Cancel" 和 "Save".

显示 NavigationBar

我做了什么
在情节提要中:

  1. 我用 ctrl 将单元格从 A 拖到 B,并设置了 segue identifer "selectItem"
  2. 我选B select "Editor - Embed in - Navigation Controller"

在 A 中 ViewController:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifer == "selectItem" {
        if let indexPath = self.tableView.indexPathForSelectedRow() {
            let destinationViewController = segue.destinationViewController as B
            // Pass value from A to B
        }
    }
}


错误:应用程序在 let destinationViewController = segue.destinationViewController as B 崩溃,错误为 swift_dynamicCastClassUnconditional。如果我没有在 B 中嵌入导航控制器,程序就不会崩溃。但我真的需要一个导航栏。
有什么解决方案或其他方法可以实现这一目标吗?谢谢!


PS:我尝试从情节提要中的对象库中拖出一个 NavigationBar,但是它缺少了一部分背景来覆盖状态栏...

  1. 在故事板中创建两个 UITableViewController
  2. Select 您的第二个 UITableViewController(您想要模态呈现的那个),并将其嵌入 UINavigationController.
  3. 将“取消”和“保存UIBarButtonItem添加到第二个[=的UINavitionItem中11=].
  4. Select 你的第一个 UITableViewController
  5. UITablViewCell
  6. Control+Drag 进入你的 UINavigationController.
  7. Select “Present Modally”在下拉列表的 "Selecteion Segue" 选项下。
  8. 要在您的第一个 UITableViewController 中传递数据,请重写方法:

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

        if segue.identifier == "identifier" {
            let destination = segue.destinationViewController as UINavigationController
            let bViewController = destination.topViewController as BViewController

            // pass data
        }
}

截图如下:

这应该可以完成工作,干杯!

我解决了!
我在let dest = segue.destinationViewController as B这一行加了一个BreakPoint,发现segue.destinationViewControllerNavigationController类型的。所以我通过将此行替换为:

来修复它
let dest = segue.destinationViewController as UINavigationController
let bVC = dest.topViewController as B

并做一些传递价值的事情。
希望这会帮助其他面临这个问题的人。

我用

if let b = segue.destinationViewController.childViewControllers.first as? B {
    //do something with b
}

对于这种情况。不过,这实际上只是语法差异。