故事板下添加的导航项

Posted

技术标签:

【中文标题】故事板下添加的导航项【英文标题】:Navigation item added under storyboard 【发布时间】:2017-03-14 23:05:43 【问题描述】:

我有一个使用标签栏的项目。标签栏中的所有标签都有相同的主导航控制器。在其中一个视图上,我希望有用户可以使用的自定义按钮。

我在将这些按钮添加到情节提要并显示它们时遇到问题:

    以编程方式添加它们

我的项目是用 Objective-C 编写的,所以我尝试以编程方式将它们添加到我的 viewController:

self.navigationItem.rightBarButtonItem =  [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                                                                                        target:self
                                                                                        action:@selector(myFriendsView)];

我还尝试使用以下方法添加它们:

self.navigationController.navigationItem.rightBarButton = ...

由于初始方法不起作用。我不知道是否需要指向标签栏导航控制器的指针来添加按钮。这两种方法都不起作用。

    在情节提要中添加按钮

我在情节提要中的 viewController 中添加了一个导航项,然后将我的按钮拖到其中。你可以看到下面的截图:

这种技术的问题是当我加载代码时按钮没有出现。我再次认为这可能与 UITabBar 导航控制器覆盖故事板有关。

    向情节提要添加导航控制器以加载 viewController

接下来我尝试添加 UINavigationController,然后将我的 viewController 作为根视图加载。根视图仍然包含导航项和按钮。

这是似乎对我所追求的功能产生任何影响的第一种方法。奇怪的是,导航项被添加到导航栏下方:

如您所见,它在导航栏下方而不是在其中添加了导航项。此功能按预期工作,只是按钮位置错误。

    我尝试过的其他方法:

-将 UIBarbuttonItems 拖到故事板中的导航控制器导航栏中

结论: 对我来说,这似乎应该是用故事板轻松实现的事情。我不明白是什么导致此代码无法正常工作,以及为什么 Apple 会启用在导航栏下添加导航项的功能,而无需我将导航栏添加到情节提要的同一视图中。

如果有人能给我关于使用故事板的建议,以及在使用标签栏时如何将导航按钮添加到视图控制器,将不胜感激。

【问题讨论】:

"标签栏中的所有标签都有相同的主导航控制器" 好的,我们只讨论问题的第二句话,这已经没有意义了。我认为您的意思是这是一个带有多个子视图控制器的标签栏 controller?但是他们怎么可能都有“相同的导航控制器”呢? @matt 我们有一个主导航控制器,它加载一个视图控制器,它是一个 UITabBarController。当我说“它们都有相同的导航控制器”时,我的意思是每个视图都没有在情节提要中添加自己的导航控制器。相反,我们将 viewControllers 加载到 UITabBar 中。我认为这意味着它们都共享相同的导航控制器。 如果我理解正确,这意味着您在导航控制器中有一个标签栏控制器。这意味着导航控制器只有 一个 子“共享”它,即标签栏控制器。导航控制器的状态不会咨询标签栏的子级。 这就是为什么您尝试做的事情不起作用的原因。标签栏控制器的孩子不在导航界面中(即使他们的祖父是导航控制器)。标签栏控制器是。从一个视图控制器切换到另一个视图控制器不会对导航控制器、导航栏等产生任何影响。 我不知道你做了什么让它“工作”,所以你应该相信并回答你自己的问题! (在 Stack Overflow 上完全合法;几天后您甚至可以接受自己的答案。) 【参考方案1】:

非常感谢 @matt 帮助我思考这个问题。

这是一个有趣的案例,我需要更加努力地思考实际发生的事情才能找到答案——在这种情况下,需要 cmets 的一些帮助。

问题是我没有将导航项设置在正确的位置。我的应用程序的框架设置如下:

tabBarController -> viewController -> navigationBar

我最初的方法是尝试在 viewController 上设置导航项。正如您在上面的框架中看到的,没有要设置的导航项。这就是 self.navigationController 不起作用的原因。

接下来我尝试添加一个 navigationController 来解决这个问题:

tabBarController -> navigationController -> viewController -> navigationBar

这也不起作用,因为导航栏首先在 tabBarController 中设置,因此 navigationController 不会覆盖它。

这一步是我逻辑上的漏洞。我假设我的代码/故事板某处有问题,因为我设置的导航控制器和项目没有出现。

问题在于我没有理解问题所在。在这种情况下,我们有控制 tabBar 的 tabBarController。这控制导航栏。这意味着如果我想访问它,我需要获取父视图的当前导航控制器。这可以通过 self.tabBarController 轻松完成:

解决办法:

self.tabBarController.navigationItem.rightBarButtonItem = ...;

如您所见,这与我在上述问题中的尝试非常相似。两者都遵循导航项的约定。不同之处在于,在解决方案中,我访问的是整个视图的父 navigationController。

【讨论】:

以上是关于故事板下添加的导航项的主要内容,如果未能解决你的问题,请参考以下文章

如何向现有的故事板添加后退按钮和导航栏?

故事板中未显示导航栏

iOS - 故事板中的导航控制器

Objective-c 故事板 - UITableViewController 中的导航栏没有出现

故事板上的侧边栏导航菜单

推送在导航控制器(故事板)中不起作用