我从主视图控制器到详细视图控制器设置了segue,但是当它显示时,导航栏仍然与源视图相同 - “关闭”按钮和主标题。我期待看到一个“后退”按钮和我正在打开的详细信息屏幕的标题(我在prepareForSegue
中设置了标题)。 Xcode的编辑器在那里显示了一个后退按钮,显然是通过连接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没有显示详细视图的导航项。我尝试将其演示文稿从全屏更改为当前上下文,但这没有明显区别。
如何获取此详细信息视图以显示其自己的导航项并显示“后退”按钮?
答案 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
}