我的屏幕包含 UITabBar(选项卡)和 childViewController(内容)。
当我切换到另一个选项卡时,我用下一个代码替换当前的子选项:
private func replaceChild(_ old: UIViewController?, with new: UIViewController, in container: UIView) {
old?.view.removeFromSuperview()
old?.removeFromParentViewController()
container.addSubviewWithConstraints(new.view)
self.addChildViewController(new)
self.replaceNavBar(with: new)
}
我还尝试从 child 那里窃取 barButtons 并将它们放入 VC 中:
private func replaceNavBar(with new: UIViewController) {
self.title = new.title
self.navigationItem.leftBarButtonItems = new.navigationItem.leftBarButtonItems
self.navigationItem.rightBarButtonItems = new.navigationItem.rightBarButtonItems
}
控制台检查第一个选项卡的 rightBarButtonItem 设置(右键 +): 之前:
oldVC: nil
newVC: <UIBarButtonItem: 0x7fb5f742bb50> target=0x7fb5f907c800 action=createNewMessage systemItem=Add
之后:
oldVC: <UIBarButtonItem: 0x7fb5f742bb50> target=0x7fb5f907c800 action=createNewMessage systemItem=Add
此外,如果我设置 nil (对于选项卡,不需要 barButtons) - 在调试器中所有显示都正常并且不会发生错误消息。
但是在用户界面上,所有按钮保持不变(如果第一个选项卡带有按钮 - 显示按钮并触发操作。如果没有按钮 -> 没有按钮)。我将子项存储在主 VC 的数组中 - 因此,不会发生重新初始化
我很确定,这是可能的,因为我前段时间已经实现了这个流程并且它工作正常(将子按钮放置到主 VC,但存储目标和选择器),但我丢失了该代码
问题:我如何窃取子 VC 中的 barButtonItems 并将它们放入父 VC navItem 中?
更新 我用愚蠢的代码检查了 barButton 设置,它起作用了,但在 UI 上不起作用:if 和 else block 内的断点轮流调用,但没有按钮添加到 navItem:
if let _ = self.navigationItem.rightBarButtonItem {
self.navigationItem.rightBarButtonItem = nil
} else {
let addButton = UIBarButtonItem.init(barButtonSystemItem: .add, target: nil, action: nil)
addButton.tintColor = .white
self.navigationItem.rightBarButtonItem = addButton
}
我还尝试了 self.navigationController?.navigationItem.rightBarButtonItem
Swift 4.1、Xcode 9.4.1
最佳答案
找到的解决方案:
我忘记了一件非常重要的事情 - 我的 VC 是另一位 VC 的 child 。
所以我不应该执行 self.navigationItem.rightBarButtonItem = ...
而是 self.parent?.navigationItem.rightBarButtonItem = ...
关于ios - 如何将 barButtonItems 从子 Controller 放入 navItem?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51936120/