如何在使用UIPageViewController时将UIBarButtonItem添加到NavigationBar

Ben*_*Ben 11 uinavigationbar uinavigationcontroller uibarbuttonitem ios uipageviewcontroller

请原谅我,已经有很多关于如何以编程方式将UIBarButtonItem添加到NavigationBar的问题,但我似乎无法让任何解决方案在我的情况下工作.

这是我一直在学习UIPageViewController的简单测试应用程序的布局.

故事板

我有页面视图控制器与三个独特的viewControllers很好地工作.我现在想rightBarButtonItems为每个视图控制器设置唯一.我可以轻松地设置一个共同barButtonItemDetailViewController通过简单地这样做.

UIBarButtonItem *newButton = [[UIBarButtonItem alloc] initWithTitle:@"Whatever" 
                              style:UIBarButtonItemStylePlain 
                              target:self 
                              action:@selector(doSomething)];    

self.navigationItem.rightBarButtonItem = newButton;
Run Code Online (Sandbox Code Playgroud)

鉴于我需要为这三个页面中的每个页面都有一个独特的按钮,pageViewController我无法在中设置按钮detailViewController.我viewDidAppear在三个控制器上尝试了上面的代码, 但按钮不会出现.我也尝试以相同的方式创建按钮,然后设置它,没有运气.

DetailViewController *vc = [[DetailViewController alloc] init];
vc.navigationItem.rightBarButtonItem = newButton;
Run Code Online (Sandbox Code Playgroud)

我知道我离这里很近,我只是不确定如何指定我需要在NavigationController的NavigationBar中添加一个按钮,该按钮运行我的contentViewControllers所嵌入的detailViewController.任何帮助都会很棒特别是SNIPPETS.

作为旁注,我尝试了一些其他方法,这些方法都存在问题.

  • 设置按钮viewDidLoad而不是viewDidAppear
    • 这不起作用,因为viewDidLoad每次从一个页面滑动到下一个页面时都不会调用该方法.viewDidAppear然而,方法是我试图在那里设置按钮.有可能viewWillAppear每次调用,但我没有检查.
  • 在UIPageViewController委托方法中设置按钮
    • 如果用户翻阅页面以快速按钮将无法更改或无法显示,则会出现问题.

事实证明我很接近...而不是在UIPageViewController方法中创建按钮,我只需要navigationItem在我的三个视图控制器中创建一个属性.当控制器在委托方法中实例化时,我只需将navigationItem属性设置为等于detailViewController的属性.在我的viewDidApper方法中,我可以创建按钮.然后在viewWillDisappear我将按钮设置为nil.你也可以在创建按钮viewdidLoadDetailViewController和更改文本和行动viewDidAppear的各个viewControllers的.这是一个例子.

在委托方法中

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
Run Code Online (Sandbox Code Playgroud)

我基于viewController的索引调用了一个辅助方法.辅助方法在调用视图控制器时实例化它.实例化后,我设置了一些属性,包括navigationItem属性.

-(FirstController *)controllerAtIndex:(NSUInteger)index
{

    FirstController *fvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstPageController"];
    fvc.imageFile = self.pageImages[index];
    fvc.titleText = self.pageTitles[index];
    fvc.pageIndex = index;
    fvc.navItem = self.navigationItem;
    return fvc;

}
Run Code Online (Sandbox Code Playgroud)

然后在viewDidAppearviewController中我就这样做了

-(void)viewDidAppear:(BOOL)animated
{

    UIBarButtonItem *newButton = [[UIBarButtonItem alloc]
                               initWithTitle:@"Whatever" style:UIBarButtonItemStylePlain target:self action:@selector(doSomething)];
    navItem.rightBarButtonItem = newButton;

}
Run Code Online (Sandbox Code Playgroud)

mro*_*les 2

如果您需要在每次更改查看的页面时更改按钮,则必须在您尝试过的委托方法之一中完成。不过,我建议您只需更改标题,而不是创建新按钮并将其设置为导航项。

您可以在界面生成器中创建按钮并将其链接到您的属性中DetailViewController,然后每次转到新页面时调用该按钮setTitle:forStateUIControlStateNormal

如果您需要按钮为每个页面执行不同的操作,我建议在按钮操作方法中检查当前页面,而不是每次都声明一个新页面。