添加到iOS/Swift中的现有UINavigationController

添加到iOS/Swift中的现有UINavigationController,ios,swift,xcode,Ios,Swift,Xcode,我有一个现有的导航控制器代理,在应用程序中的每个视图控制器上放置一个菜单按钮 class MyNavigationControllerDelegate: NSObject, UINavigationControllerDelegate { func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated:

我有一个现有的导航控制器代理,在应用程序中的每个视图控制器上放置一个菜单按钮

class MyNavigationControllerDelegate: NSObject, UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        let navItem = viewController.navigationItem
        let menuBtn = MyCustomMenuButton()
         ...
        navItem.setRightBarButton(menuBtn, animated: false)
}
这非常好…我在导航栏中为每个视图设置了一个菜单按钮。但对于某些视图,我想在菜单按钮旁边的右侧添加另一个按钮,因此我添加了以下内容:

class CustomViewController: UIViewController, UINavigationControllerDelegate {

   override func viewDidLoad() {
        super.viewDidLoad()
        let newButton = UIBarButtonItem(title: "(+)", style: .plain, target: nil, action: nil)
        self.navigationItem.rightBarButtonItem = newButton
   }
}
但这没有效果。菜单按钮仍然存在,但未添加新按钮。那么应该如何做呢

但这没有效果

是的。但是你没有时间看到效果。你说了两遍同样的话,因为
setRightBarButtonItem
rightBarButtonItem=…
是一样的,所以无论你说第二个,那都是最终被遵守的;无论哪种方式,它都会撕掉现有的右栏按钮项,并用另一个替换它

如果目标是拥有多个右栏按钮项,那么这就是
rightBarButtonItems
的作用(注意复数形式)。您可以调用
setRightBarButtonims
(再次注意复数形式)。当然,看看是否已经有一个右栏按钮项目,并考虑到这一点取决于您。没有神奇的
append
方法

但这没有效果

是的。但是你没有时间看到效果。你说了两遍同样的话,因为
setRightBarButtonItem
rightBarButtonItem=…
是一样的,所以无论你说第二个,那都是最终被遵守的;无论哪种方式,它都会撕掉现有的右栏按钮项,并用另一个替换它


如果目标是拥有多个右栏按钮项,那么这就是
rightBarButtonItems
的作用(注意复数形式)。您可以调用
setRightBarButtonims
(再次注意复数形式)。当然,看看是否已经有一个右栏按钮项目,并考虑到这一点取决于您。没有神奇的
append
方法。

我可以覆盖
CustomViewController
中的
UINavigationControllerDelegate
,但这是最好的/唯一的方法吗?我可以覆盖
CustomViewController
中的
UINavigationControllerDelegate
但这是最好的/唯一的方法吗?使用委托文件中的
setRightBarButtonims
会将该委托与此特定视图控制器更紧密地耦合,因此我试图避免在委托中指定特定视图控制器。目前,有效的解决方案需要在视图控制器中使用
setRightBarButtonims
重复代码。我觉得这很管用,但很草率。现在我不知道你在说什么。问题是为什么你只看到一个右栏按钮项,我解释了。事实上,问题是“应该如何做”,而不是“为什么会发生这种情况”,但你让我走上了正确的道路,“没有神奇的附加方法。”在委托文件中使用
setRightBarButtonims
将使该委托与此特定视图控制器更紧密地耦合,因此我试图避免在委托中指定特定视图控制器。目前,有效的解决方案需要在视图控制器中使用
setRightBarButtonims
重复代码。我觉得这很管用,但很草率。现在我不知道你在说什么。问题是为什么你只看到一个右栏按钮项,我解释了。事实上,问题是“应该如何做”,而不是“为什么会发生这种情况”,但你让我走上了正确的道路,“没有神奇的附加方法。”