从 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 标题的主要内容,如果未能解决你的问题,请参考以下文章

从单独的文件中包含一个 Ruby 类

从数组中包含的行索引中选择矩阵的列[重复]

从列表中包含的字符串命名 df 列

从多个模型中包含、选择、排序、限制(单个查询)

从 Ruby 中包含的文件中访问变量

如何从js文件中包含qml文件