9

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

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

storyboard

我有三个独特的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; 

我知道我靠近这里,我只是不知道如何指定我需要一个按钮添加到正在运行detailViewController我contentViewControllers嵌入在NavigationController的导航栏。任何帮助将是伟大的特别SN​​IPPETS。

作为一个侧面说明,我尝试了一些其他方法出现问题。

  • viewDidLoad设置按钮,而不是viewDidAppear
    • 这是行不通的,因为viewDidLoad方法不叫你刷卡从一个页面到下每次。然而,viewDidAppear方法是,所以我试图在那里设置按钮。有可能每次调用viewWillAppear但我没有检查。
  • 在UIPageViewController委托方法
    • 这是有问题的,如果用户翻阅的页面快速按钮将无法更改或无法显示设置按钮。

SOLUTION

原来我很接近......而不是在UIPageViewController方法,我只是需要建立在每一个我的三个视图控制器的navigationItem属性创建按钮。当控制器在委托方法中实例化时,我只需将navigationItem属性设置为与detailViewController相同。在我的viewDidApper方法中,我可以创建按钮。然后在viewWillDisappear我将按钮设置为nil。您也可以创建DetailViewControllerviewdidLoad按钮并更改各个viewControllers的文本和操作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; 

} 

然后在的viewController的viewDidAppear我只是这样做

-(void)viewDidAppear:(BOOL)animated 
{ 

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

} 
+0

viewControllers上的navItem属性是什么? –

+0

伟大的解决方案:-) – Fabrizio

回答

1

如果您每次更改所看到的页面时都需要更改该按钮,则必须使用您尝试的其中一种委托方法完成此操作。然而,我建议您不要创建一个新按钮并将其设置为导航项目,而只需更改标题。

您可以在界面构建器中创建按钮并将其链接到您的DetailViewController中的某个媒体资源,然后每次进入新页面时都会按钮上的setTitle:forStateUIControlStateNormal

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

+1

mros,感谢您的回答,我不得不尝试让委托方法为我工作。经过一些故障排除后,我意识到这个问题,我之前尝试使用'vc.navigationItem.rightBarButtonItem'等设置按钮。我基本上是创建一个新的导航项并添加一个按钮。由于navigationController的特性,新的navigationItem不会出现在其顶部。然后我意识到我可以简单地通过委托方法将我的DetailViewController中的navigationItem属性传递给我的单独页面视图控制器。谢谢! – Ben

0

我的一位同事经历了网页浏览器相同的问题。

据我所知,你不会添加UIBarButtonItem到UIPageViewController的成员视图控制器的导航栏。对于UIPageViewController,原因是'navigationController'被设置为零。要确认,请打印[UIPageViewController navigationController]的值。

但是你可以做一件事来克服这个问题。请下载示例PhotoScroller

而且做AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
// kick things off by making the first page 
PhotoViewController *pageZero = [PhotoViewController photoViewControllerForPageIndex:0]; 

UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:pageZero]; 
if (pageZero != nil) 
{ 
    // assign the first page to the pageViewController (our rootViewController) 
    UIPageViewController *pageViewController = (UIPageViewController *)self.window.rootViewController; 
    pageViewController.dataSource = self; 

    [pageViewController setViewControllers:@[nav] 
            direction:UIPageViewControllerNavigationDirectionForward 
            animated:NO 
           completion:NULL]; 
} 
return YES; 
} 

以下变化及PhotoViewController.m

- (void)loadView 
{ 
..... 
..... 
self.title [email protected]"Frogs"; 
UIBarButtonItem *newButton = [[UIBarButtonItem alloc] initWithTitle:@"Something" style:UIBarButtonItemStylePlain target:self action:@selector(doSomething)]; 

[newButton setTintColor:[UIColor redColor]]; 
self.navigationItem.rightBarButtonItem = newButton; 
} 

为了避免撞车以下更改,必须正确处理AppDelegate.m UIPageViewControllerDataSource委托方法

虽然,我不会建议你在上面做,因为它打破了UIPageViewController的整个概念。

我希望这会有所帮助。

+0

Hitesh,感谢您的意见,但我将避免这条路线!只要您的UIPageViewControllerDataSource嵌入到导航控制器中,您实际上可以将UIBarButtonItems添加到navBar。我在我的问题中的示例基本上将UIPageViewController成员置于Master-Detail应用程序的detailViewController的顶部。这样导航栏仍然保持活动状态。我忽略了将detailViewController的navigationItem属性传递给我的pageViewController成员。一旦意识到这是一个简单的任务!再次感谢 – Ben

1

您可以通过在其分页视图控制器之一中找到页面控制器,然后获取其导航项目,找到正确的导航项目以设置按钮/标题。例如

UIViewController *pageController = [[self.navigationController childViewControllers] lastObject]; 
pageController.navigationItem.title = @"My page's title"; 

这真的很烦人,self.navigationItem不起作用!

相关问题