Segue和导航控制器交互

时间:2018-05-03 21:56:55

标签: ios uinavigationcontroller segue uistoryboardsegue

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

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

  • 主屏幕是一个导航控制器,里面有一个标签控制器。这两个选项卡显示不同的数据,但使用相同的表视图控制器类。
  • 每个选项卡都包含一个带有表视图控制器的导航控制器。
  • 每个表视图控制器都有一个Show segue到详细视图控制器。
  • 当点击特定表项时,表视图控制器会调用performSegue(withIdentifier:,sender:)
  • 表视图控制器有prepareForSegue将数据传递给详细控制器,并且工作正常:数据显示在详细信息表中。

enter image description here

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没有显示详细视图的导航项。我尝试将其演示文稿从全屏更改为当前上下文,但这没有明显区别。

如何获取此详细信息视图以显示其自己的导航项并显示“后退”按钮?

1 个答案:

答案 0 :(得分:1)

从你的屏幕截图来看,似乎问题可能是你在navigationController中有tabBarController。

你应该使用TabBarController作为根视图控制器(箭头应该指向它),它不应该嵌入在导航控制器的堆栈中,特别是它不应该是navigationController的rootVC。​​

请阅读Apple -NavigationController rootViewController

  

rootViewController位于底部的视图控制器   导航堆栈。这个对象不能是一个实例   UITabBarController类。

您的下面评论说您通过将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
}