ios - 如何将 barButtonItems 从子 Controller 放入 navItem?

标签 ios swift parent-child uibarbuttonitem childviewcontroller

我的屏幕包含 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 上不起作用:ifelse 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/

相关文章:

c - 信号量无法正常工作

子进程执行整个过程

iphone - AQGridView 背景图片

ios - 无法将类型 '[String : String?]' 的值转换为预期的参数类型 '[String : AnyObject?]'

ios - 如何使用 AVPlayerLooper 循环播放视频

Swift 4 添加注释错误在解包时意外发现 nil

ios - 在 SDAnimatedImageView 中重复源图像

ios - 将任务分派(dispatch)到队列中以便在另一个线程中运行任务

iOS 11 UISearchController 在输入时消失

java - 如何检查 Attribute(object) 在 Java 中是否为 null