请原谅我,关于如何在编程方式下将UIBarButtonItem添加到NavigationBar已经有很多问题了,但似乎我无法让任何解决办法在我的情况下起作用。
这是一个简单的测试应用程序布局,我一直在使用它来学习UIPageViewController。
我已经成功地使用三个独特的viewControllers使页面视图控制器正常工作。现在,我想为每个视图控制器设置不同的rightBarButtonItems
。我可以通过简单地执行以下操作,在DetailViewController
中设置通用的barButtonItem
。
UIBarButtonItem *newButton = [[UIBarButtonItem alloc] initWithTitle:@"Whatever"
style:UIBarButtonItemStylePlain
target:self
action:@selector(doSomething)];
self.navigationItem.rightBarButtonItem = newButton;
考虑到我需要为pageViewController
中的三个页面各自设计一个唯一的按钮,因此我无法在detailViewController
中设置该按钮。我已经尝试了上述代码,在三个控制器的viewDidAppear
方法中使用,但是按钮不会出现。我还尝试过以同样的方式创建按钮,然后进行以下设置,但没有成功。
DetailViewController *vc = [[DetailViewController alloc] init];
vc.navigationItem.rightBarButtonItem = newButton;
我知道我接近成功了,只是不确定如何指定需要向运行我的contentViewControllers所嵌入的detailViewController的NavigationBar添加一个按钮的NavigationController。任何帮助都将是极好的,特别是代码片段。
顺便说一下,我尝试过其他一些方法,但出现了问题:
- 在
viewDidLoad
中设置按钮而不是viewDidAppear
中设置 - 这样做不起作用,因为
viewDidLoad
方法并不会在每次从一张页面划到另一张页面时都被调用。然而,viewDidAppear
方法会被调用,因此我正在尝试在那里设置按钮。也有可能viewWillAppear
被每次调用,但我没有检查。 - 在UIPageViewController委托方法中设置按钮
- 如果用户快速翻阅页面,则此方法存在问题,按钮将无法更改或无法显示。
解决方案
事实证明我已经接近成功了...我只需要在我的三个视图控制器中创建一个navigationItem
属性,而不是在UIPageViewController方法中创建按钮。当控制器在委托方法中被实例化时,我只需要将navigationItem属性设置为detailViewController的属性。这样,在我的viewDidApper
方法中,我就可以创建按钮了。然后在viewWillDisappear
时,我将按钮设置为nil
。您也可以在DetailViewController
的viewdidLoad
中创建按钮,并在各个视图控制器的viewDidAppear
中更改文本和操作。以下是一个示例:
在委托方法中:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
根据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;
}
然后在视图控制器的viewDidAppear
中,我只需这样做
-(void)viewDidAppear:(BOOL)animated
{
UIBarButtonItem *newButton = [[UIBarButtonItem alloc]
initWithTitle:@"Whatever" style:UIBarButtonItemStylePlain target:self action:@selector(doSomething)];
navItem.rightBarButtonItem = newButton;
}