程序化的UINavigationController和segue

时间:2016-05-30 21:50:24

标签: ios swift uiviewcontroller segue

在我的代码中,我需要浏览导航层次结构,这就是我在UIViewController中有UINavigationController的原因。

如果用户在单元格上标记并且有下一级别,我会再次创建相同的UIViewController并将其推送到UINavigationController。这很好。

但是当我到达层次结构的末尾并尝试performSegueWithIdentifier时,要转到其他控制器查看详细信息,应用程序崩溃并说

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
 reason: 'Receiver (<myproject.MenuController: 0x7fb2e0ea9ef0>)
has no segue with identifier 'showDetail''

但是我检查了InterfaceBuilder,一切都很好。 有趣的是,如果我不推动下一级导航并直接对新控制器执行segue,那么一切运行良好。

我也尝试推送新控制器,就像我正在使用导航一样,但是它尝试访问新的控制器委托,奇怪的是nil并崩溃。

有人知道怎么做吗?

完整代码(在MenuContoller中)

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
//self.performSegueWithIdentifier("showDetail", sender: self)
let clickedCell = self.tableViewItems[indexPath.row]
print("Selected \(clickedCell.itemID)")
// Check if subview has children, then we push a deeper level on the navigation controller
if (menuItems.filter{$0.parentID == clickedCell.itemID}.count > 0) {
  let subNavigationController = MenuController()
  // Set the currentNavigationItemID for the new view controller
  subNavigationController.currentNavigationItemID = clickedCell.itemID
  subNavigationController.title = clickedCell.itemDisplayName
  self.navigationController?.pushViewController(subNavigationController, animated: true)
} else {
  // Load new Controller to show details
  self.performSegueWithIdentifier("showDetail", sender: self)
//      let subNavigationController = ProductListViewController()
//      subNavigationController.currentCategoryID = clickedCell.itemID
//      self.navigationController?.pushViewController(subNavigationController, animated: true)
}

1 个答案:

答案 0 :(得分:2)

问题是您的MenuController尚未从故事板创建,因此它没有附加任何segue。

您需要让故事板创建MenuController,而不是:

let subNavigationController = MenuController()

你需要:

let subNavigationController = self.storyboard?.instantiateViewControllerWithIdentifier("menuControllerID")

要使其正常工作,必须在 Identity Inspector 中为"menuControllerID" MenuController设置情节提要ID。