【问题标题】:Segue and navigation controller interactionSegue 和导航控制器交互
【发布时间】:2018-10-14 07:39:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的设置屏幕截图可能有助于确定问题。另外,你在故事板的 segue 上使用 ShowShow Detail 类型吗?
  • 这是 Show segue 类型。
  • 我刚刚看了你的描述,主屏幕是一个导航控制器,里面有一个tabBar控制器,然后每个标签都有自己的导航控制器(总共3个navController)?或者它是一个 tabBarController,每个选项卡都有自己的 navigationController(总共 2 个 navControllers)?
  • 已添加屏幕截图。
  • 为什么有一个navigationController作为入口屏幕?它的用途是什么?也许摆脱它并让tabBar成为主要入口

标签: ios uinavigationcontroller segue uistoryboardsegue


【解决方案1】:

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

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

阅读这里Apple -NavigationController rootViewController

rootViewController 位于底部的视图控制器 导航堆栈。此对象不能是 UITabBarController 类。

您下面的 cmets 说您通过将 tabBarVC 设置为应用程序的根来重新排列所有内容(指向它的箭头),但它仍然不起作用。很难确定问题所在。

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

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
}

【讨论】:

  • 不,这没有帮助。我也已经在尝试在那里设置rightBarButtonItem
  • 不,我已经在尝试设置它了。看起来这个视图控制器的 navigationItem 只是没有被使用。
  • 这是一个奇怪的问题,当你进入调试器时,使用断点,数据是否正在转移到下一个 vc 中?
  • 你的意思是prepareForSegue?是的,详细视图控制器正在正确显示其内容。
  • 所以prepareToSeque中数据传输成功,detailVc成功推送,但是导航标题显示错误,没有返回按钮?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2019-01-21
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
相关资源
最近更新 更多