如何让自定义导航控制器为每个故事板提供相同的自定义导航栏按钮

Posted

技术标签:

【中文标题】如何让自定义导航控制器为每个故事板提供相同的自定义导航栏按钮【英文标题】:How to have a custom navigation controller supply the same custom navBar buttons to each storyboard 【发布时间】:2017-08-16 22:16:32 【问题描述】:

我想要的是在导航控制器的导航栏中使用自定义按钮而不是后退按钮和标题。我创建了一个自定义导航控制器。在自定义导航控制器内部(在 viewdidload 函数内部),我有这个:

let leftButtonItem = UIBarButtonItem.init(
     title: "My Connections",
     style: .done,
     target: self,
     action: #selector(goToPartners)
     )

   let middleButtonItem = UIBarButtonItem.init(
     title: "Home",
     style: .done,
     target: self,
     action: #selector(goHome)
     )

self.navigationItem.setLeftBarButtonItems([leftButtonItem, middleButtonItem], animated: false)

我没有错误,但我的导航栏中除了标题(自动继承自该故事板标题)之外什么都没有显示

【问题讨论】:

仔细检查您正在使用您创建的自定义类 是的,我已经在导航控制器中设置了类 【参考方案1】:

setLeftBarButtonItems 在这种情况下不起作用。这是因为setLeftBarButtonItems 用于执行到条形按钮项的转换。

只需在视图控制器的ViewDidLoad 中将其替换为 leftBarButtonItems 即可:

self.navigationItem.leftBarButtonItems = [leftButtonItem, middleButtonItem]

这应该可以解决您的问题。

【讨论】:

这并没有解决我的问题,现在出现“无法调用非函数类型'UIBarButtonItem'的值”的错误。 你用的是swift 3.0,还是更低的版本?【参考方案2】:

覆盖导航控制器的viewDidLoad 对您没有帮助,因为它只会在导航控制器首次加载时执行。随着每个视图控制器被按下,按钮项将被更新。

我建议你实现一个UINavigationControllerDelegate 并使用它来更新navigationController(_:willShow:animated:) 方法中的navigationItem

【讨论】:

【参考方案3】:

我修复了它,我最终不得不创建一个自定义 uiviewcontroller 类,并在 viewdidload 函数中使用 setleftbarbutton 项目和 setrightbarbutton,然后将这个类继承到我的所有视图控制器中。

【讨论】:

以上是关于如何让自定义导航控制器为每个故事板提供相同的自定义导航栏按钮的主要内容,如果未能解决你的问题,请参考以下文章

iOS 上的自定义模板系统

如何让自定义 UIControl 作为推送操作参与 segue?

如何更新动态生成的故事板中的自定义特定 UITableview 单元格?

故事板下添加的导航项

故事板中的自定义 UIView

如何以编程方式创建自定义导航栏?