Segue 和导航控制器交互
Segue and navigation controller interaction
我设置了一个从主视图控制器到详细视图控制器的 segue,但是当它显示时,导航栏与源视图保持相同 - "close" 按钮和主标题。我希望看到一个 "Back" 按钮和我正在打开的详细信息屏幕的标题(我在 prepareForSegue
中设置了标题)。 Xcode 的编辑器在那里显示了一个后退按钮,这显然是通过连接 segue 触发的。
有关设置的更多详细信息:
- 主屏幕是一个导航控制器,里面有一个选项卡控制器。这两个选项卡显示不同的数据但使用相同的 table 视图控制器 class.
- 每个选项卡都包含一个带有 table 视图控制器的导航控制器。
- 每个 table 视图控制器都有到详细视图控制器的 Show segue。
- 当点击特定的 table 项时,table 视图控制器调用
performSegue(withIdentifier:,sender:)
- table 视图控制器有
prepareForSegue
将数据传递给细节控制器,这一切工作正常:数据显示在细节 table.
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
}
我设置了一个从主视图控制器到详细视图控制器的 segue,但是当它显示时,导航栏与源视图保持相同 - "close" 按钮和主标题。我希望看到一个 "Back" 按钮和我正在打开的详细信息屏幕的标题(我在 prepareForSegue
中设置了标题)。 Xcode 的编辑器在那里显示了一个后退按钮,这显然是通过连接 segue 触发的。
有关设置的更多详细信息:
- 主屏幕是一个导航控制器,里面有一个选项卡控制器。这两个选项卡显示不同的数据但使用相同的 table 视图控制器 class.
- 每个选项卡都包含一个带有 table 视图控制器的导航控制器。
- 每个 table 视图控制器都有到详细视图控制器的 Show segue。
- 当点击特定的 table 项时,table 视图控制器调用
performSegue(withIdentifier:,sender:)
- table 视图控制器有
prepareForSegue
将数据传递给细节控制器,这一切工作正常:数据显示在细节 table.
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
}