这是我遇到的问题。我无法为UIPageViewController中包含的视图设置UINavigationBar标题。
该应用程序的基本架构如下。
该应用程序的根视图控制器是一个UITabBarController,其中包含5个导航控制器。
第一个导航控制器,我遇到的问题,包含一个页面视图控制器,此页面视图控制器包含许多UIViewControllers。
我想要的是,当我浏览每个视图控制器时,我可以在UINavigationBar中设置标题。
我尝试了以下内容:
在页面视图控制器中包含的UIViewController中,我尝试过[self setTitle:@"Title I want"]
- 它没有用。
在同一个UIViewController中我也试过[self.navigationBar.navigationItem setTitle:@"Title I want"]
- 这也没有用。
我还尝试为View控制器设置标题,并试图在PageViewControllers委托方法transitionCompleted中提取它,但这也没有用。
我想知道我是否应该回到绘图板,以及我是否正在使用这种视图布局架构进入兔子洞。有没有其他人遇到过这个问题,如果有的话,你是怎么解决的?
编辑:我还必须补充说我是以编程方式执行此操作。
感谢您的帮助。
答案 0 :(得分:1)
所以,最后我提出了一种方法来实现这个目标,虽然不是我想要的最干净的解决方案,但仍适用于此目的。
代码示例
- (id)initWithIndex:(NSUInteger)index andTitle:(NSString *)navBarTitle; {
if(self = [super init]) {
self.index = index;
self.navBarTitle = navBarTitle;
}
return self;
}
代码示例
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标题,除非有人想要纠正我吗?
希望这有帮助。
答案 1 :(得分:0)
我不认为你应该在navigationBar上设置标题,你试过self.navigationController.title = @"Title";
吗?