Segue 和导航控制器交互

Segue and navigation controller interaction

我设置了一个从主视图控制器到详细视图控制器的 segue,但是当它显示时,导航栏与源视图保持相同 - "close" 按钮和主标题。我希望看到一个 "Back" 按钮和我正在打开的详细信息屏幕的标题(我在 prepareForSegue 中设置了标题)。 Xcode 的编辑器在那里显示了一个后退按钮,这显然是通过连接 segue 触发的。

有关设置的更多详细信息:

prepareForSeque代码:

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
  switch segue.identifier {
    case SegueID.stringList:
      guard let listController = segue.destination as? StringListViewController,
            let indexPath = tableView.indexPathForSelectedRow,
            let stringListField = model.sections[indexPath.section].fields[indexPath.row/2]
                as? ListField<String>
      else { break }

      listController.strings = stringListField.values
      listController.navigationItem.title = stringListField.name
    default:
      break
  }
}

奇怪的是,Xcode 不显示详细视图的导航项。我尝试将它的演示文稿从全屏更改为当前上下文,但这没有明显的区别。

如何让这个详细视图显示其自己的导航项并显示后退按钮?

从您的屏幕截图看来,问题可能出在导航控制器中有 tabBarController。

您应该使用 TabBarController 作为根视图控制器(箭头应该指向它)并且它不应该嵌入到导航控制器的堆栈中,特别是它不应该是导航控制器的根 VC。

阅读此处Apple -NavigationController rootViewController

rootViewController The view controller that resides at the bottom of the navigation stack. This object cannot be an instance of the UITabBarController class.

您在下面的评论中说您通过将 tabBarVC 设置为应用程序的根目录(指向它的箭头)重新安排了所有内容,但它仍然无效。很难确定问题所在。

您应该使用 print 语句找出哪个导航控制器在进行推送,它可能会帮助您解决问题。

override func viewDidLoad() {
    super.viewDidLoad()

    // is this the very navController that has the tabBar as root or is this the one of the other ones?
    print("viewDidLoad: \(navigationController?.viewControllers.description as Any)") // this should print everything currently on the stack
}