存在后退按钮时,无法设置UINavigationBar标题或将UIButton放置在UINavigationBar中

时间:2019-05-11 22:12:44

标签: swift uibutton uinavigationbar uibarbuttonitem

我正在开发一个具有多个嵌套UIViewControllers的应用程序。我有两个视图,一个是带有uibarbuttonitem的根视图控制器,并已连接到另一个UIViewController。

被隔离的UIViewController不接受UIButtons或UIBarButtonItems,而且我似乎无法为其设置标题。

The Storyboard

我需要在UINavigationBar中放置标题和其他UIElement,但似乎无济于事,并且我没有在线找到任何解决方案。

UINavigationBar甚至没有出现在视图的层次结构中。

Hierarchy

谢谢您的合作。

1 个答案:

答案 0 :(得分:1)

您是对的。对于NavigationController堆栈中的ViewController,情节提要板的布局不一致且令人困惑。第一个提供对NavigationItem的直接访问,而后面的则不提供。我想这是因为只有一个NavigationItem,并且需要在推送和弹出ViewController时动态更新它。

处理此问题的方法是在代码中完成。按下ViewController时,其title属性用于在导航栏上设置标题。因此,在NavigationController堆栈中的每个ViewController中,在title中设置其viewDidLoad

self.title = "titleForThisVC"

对于rightBarButton,您也可以通过编程方式将其添加。如果这是您用于按钮的@IBAction

@objc func handleRightBarButton() {
    print("right button")
}

然后,您将像这样添加按钮(同样在viewDidLoad中):

self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Foo", style: .plain,
     target: self, action: #selector(handleRightBarButton))

最后{em> gotcha 持续UITabBarController s

如果NavigationController是UITabBarController的子代,则选项卡栏中使用的标题将按照代码设置从堆栈中的第一个ViewController拾取标题,但仅在该选项卡之后首先被访问。为了解决这个问题,还应该在 Interface Builder

Attributes Inspector 中为顶部ViewController设置title属性。