从 UIPageViewContoller 中包含的视图设置 UINavigationBar 标题
Posted
技术标签:
【中文标题】从 UIPageViewContoller 中包含的视图设置 UINavigationBar 标题【英文标题】:Set UINavigationBar title from view contained within UIPageViewContoller 【发布时间】:2015-02-27 17:38:05 【问题描述】:这是我遇到的问题。我无法为 UIPageViewController 中包含的视图设置 UINavigationBar 标题。
应用的基本架构如下。
应用程序的根视图控制器是一个 UITabBarController,其中包含 5 个导航控制器。
我遇到问题的第一个导航控制器包含一个页面视图控制器,而此页面视图控制器包含许多 UIViewController。
我想要这样,当我滑动浏览每个视图控制器时,我可以在 UINavigationBar 中设置标题。
我尝试了以下方法:
在页面视图控制器中包含的 UIViewController 中,我尝试了 [self setTitle:@"Title I want"]
- 它没有工作。
在同一个 UIViewController 中,我也尝试过 [self.navigationBar.navigationItem setTitle:@"Title I want"]
- 这也没有用。
我还尝试设置视图控制器的标题,并尝试在 PageViewControllers 委托方法 transitionCompleted 中提取它,但这也不起作用。
我想知道我是否应该回到绘图板上,以及我是否会在这种视图布局架构中陷入困境。有没有其他人遇到过这个问题,如果有,您是如何解决的?
编辑:我还必须补充一点,我正在以编程方式执行此操作。
感谢您的帮助。
【问题讨论】:
【参考方案1】:所以,最后我想出了一个方法来让这个工作,虽然不是我想要的最干净的解决方案,但仍然适合这个目的。
-
我创建了一个名为 PageLeafViewController 的新类,并设置了它的 init 方法,如下所示。页面视图控制器的子视图控制器继承自此。这是代码。
代码示例
- (id)initWithIndex:(NSUInteger)index andTitle:(NSString *)navBarTitle;
if(self = [super init])
self.index = index;
self.navBarTitle = navBarTitle;
return self;
-
这些可以在添加到 UIPageViewController 之前像这样初始化。
代码示例
ChildViewController *aChildViewController = [[ChildViewController alloc] initWithIndex:1 andTitle:@"A Title"];
您需要将 UIPageViewControllerDelegate 添加到您的页面视图控制器的界面中。这样您就可以在视图转换完成时实现委托方法的代码,并且您需要设置标题。
当 UIPageViewController 加载时,我抓取第一个视图控制器并获取其标题,将其设置为 UINavigationController 导航栏
代码示例
PageLeafViewController *initialViewController = (PageLeafViewController *)[self viewControllerAtIndex:0];
[self.navigationItem setTitle:initialViewController.navBarTitle];
-
当发生转换时,当转换到视图完成时,我们再次将标题设置为新子视图控制器的标题。
代码示例
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
PageLeafViewController *currentLeaf = (PageLeafViewController *)[self.pageViewController.viewControllers lastObject];
[self.navigationItem setTitle:currentLeaf.navBarTitle];
注意:当显示新的子视图控制器时,会自动调用上述内容。
虽然这不是目前最优雅的解决方案,但我认为不可能从子视图中调用函数来更新 NavigationBar 标题,除非有人想纠正我?
希望这会有所帮助。
【讨论】:
【参考方案2】:我认为您不应该在导航栏上设置标题,您尝试过self.navigationController.title = @"Title";
吗?
【讨论】:
如果您以编程方式执行 tabBar,则可以在将控制器添加到 TabBar 时设置标题,我认为您只需要执行ViewController.title = @"title";
或 VC.view.title
然后将其添加到控制器数组
底部的标签栏很好,我在设置它们的时候设置它们的标题。诀窍是弄清楚如何让 ViewController 告诉导航栏它需要有什么标题,这样当用户滑动时它可以很好地改变。以上是关于从 UIPageViewContoller 中包含的视图设置 UINavigationBar 标题的主要内容,如果未能解决你的问题,请参考以下文章