有什么方法可以在不推送视图控制器的情况下替换UINavigationController上的导航项?

时间:2016-09-01 05:38:05

标签: ios uinavigationbar uinavigationitem

我已经在UINavigationController的视图控制器层次结构中创建了一个视图控制器。此视图控制器包含一个全帧容器视图,用于显示子视图控制器的视图。

理想情况下,我希望显示与子视图控制器的导航项(是titlerightBarButtonItems)相关联的项目,而不是视图控制器的导航项目包含容器视图。

我最初的反应只是设置viewController.navigationItem = childViewController.navigationItem,但navigationItem是只读的。我的第二反应是自己设置相关项目,例如:

viewController.navigationItem.title = childViewController.navigationItem.title;
viewController.navigationItem.rightBarButtonItems = childViewController.navigationItem.rightBarButtonItems;

通过调配,我还能够检测到子视图控制器的导航项属性何时被设置并相应地更新。但是,如果子视图控制器的导航项属性未经替换而更新(例如,title更改文本颜色,rightBarButtonItem被禁用),则不会反映这些更改。 / p>

有没有办法达到我想要的效果?

2 个答案:

答案 0 :(得分:0)

您好先生而不是设置childviewcontroller导航项,您可以设置parentviewcontroller的导航项。

我的意思是说在加载子视图控制器之前,如果你知道childviewcontroller的navigatio bar项值,你可以设置parentviewcontroller的导航栏Item。

如果您的子视图控制器在容器内,我还有一个问题,它是如何拥有自己的导航栏,因为它可以滚动,所以最好在加载子视图控制器之前设置父视图控制器的导航栏。

答案 1 :(得分:0)

原来我的问题出在其他地方,而且我的问题中概述的方法可以正常运行。 X_X

为了使这个答案更有用,以下是我的方法的更多细节:

  • 我在UINavigationItem上创建了一个类别,并使用Mattt Thompson的教程(http://nshipster.com/method-swizzling/)对方法-[setTitle:]-[setRightBarButtonItems:]进行了调整。混合方法只需分别发布自定义NSNotifications UINavigationItemTitleDidChangeUINavigationItemRightBarButtonItemsDidChange
  • -[prepareForSegue:sender:]中,我提取了我的嵌入segue的目标视图控制器,并将其存储在我的视图控制器上的自定义属性childViewController中。
  • 在我的视图控制器的childViewController的setter中,我使用我的子视图控制器的导航项作为对象,将观察者添加到我的自定义UINavigationItem通知中。
  • 当收到这些通知时,我分别更新视图控制器导航项的title和rightBarButtonItems。

我自己的修复中的“其他地方”是我的孩子视图控制器在我认为它没有更新其右边的按钮项时,所以看起来好像视图控制器呈现它没有获得其右边的按钮项目