Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在使用UIPageViewController时将UIBarButtonim添加到导航栏_Ios_Uinavigationcontroller_Uinavigationbar_Uibarbuttonitem_Uipageviewcontroller - Fatal编程技术网

Ios 如何在使用UIPageViewController时将UIBarButtonim添加到导航栏

Ios 如何在使用UIPageViewController时将UIBarButtonim添加到导航栏,ios,uinavigationcontroller,uinavigationbar,uibarbuttonitem,uipageviewcontroller,Ios,Uinavigationcontroller,Uinavigationbar,Uibarbuttonitem,Uipageviewcontroller,请原谅,关于如何以编程方式将UIBarButtonim添加到导航栏,已经有很多问题了,但在我的情况下,我似乎找不到任何解决方案 下面是我学习UIPageViewController时使用的一个简单测试应用程序的布局 我的页面视图控制器与三个独特的视图控制器配合得很好。现在,我想为每个视图控制器设置唯一的RightBarButtonims。我可以简单地在DetailViewController中设置一个常见的barButtonItem UIBarButtonItem *newButton = [

请原谅,关于如何以编程方式将UIBarButtonim添加到导航栏,已经有很多问题了,但在我的情况下,我似乎找不到任何解决方案

下面是我学习UIPageViewController时使用的一个简单测试应用程序的布局

我的页面视图控制器与三个独特的视图控制器配合得很好。现在,我想为每个视图控制器设置唯一的
RightBarButtonims
。我可以简单地在
DetailViewController
中设置一个常见的
barButtonItem

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

self.navigationItem.rightBarButtonItem = newButton;
鉴于我需要为
pageViewController
中的三个页面中的每一个页面设置一个唯一的按钮,我无法在
detailViewController
中设置该按钮。我已经在三个控制器的
viewdide
中尝试了上述代码,但按钮不会出现。我也尝试过以同样的方式创建按钮,然后像这样设置,但运气不好

DetailViewController *vc = [[DetailViewController alloc] init];
vc.navigationItem.rightBarButtonItem = newButton;
我知道我离这里很近了,我只是不知道如何指定我需要在NavigationController的导航栏上添加一个按钮,该导航栏正在运行我的ContentViewController嵌入的detailViewController。任何帮助都会很好,尤其是片段

作为旁注,我尝试了一些其他的方法,这些方法出现了问题

  • viewdiload
    中设置按钮,而不是在
    viewdilease
    • 这将不起作用,因为不是每次从一页滑动到下一页时都调用
      viewDidLoad
      方法。然而,
      viewdideappear
      方法是无效的,因此我尝试在那里设置按钮。有可能每次调用
      视图时都会出现
      ,但我还没有检查
  • 在UIPageViewController委托方法中设置按钮
    • 如果用户快速翻页,按钮将无法更改或显示,则会出现问题
解决方案

结果证明我很接近了…我只需要在三个视图控制器中的每一个中创建
navigationItem
属性,而不是在UIPageViewController方法中创建按钮。当在委托方法中实例化控制器时,我只需将navigationItem属性设置为detailViewController的属性。这样,在我的
viewdiapper
方法中,我可以创建按钮。然后在
视图将消失
时,我将按钮设置为
nil
。您也可以在
DetailViewController
viewdidLoad
处创建按钮,并更改各个viewcontroller的
viewdide
中的文本和操作。这是一个样本

在委托方法中

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

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
我根据viewController的索引调用一个helper方法。helper方法在调用时实例化视图控制器。实例化后,我设置了一些属性,包括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的
视图中出现
,我就这样做了

-(void)viewDidAppear:(BOOL)animated
{

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

}

我的一位同事在使用页面视图控制器时遇到了同样的问题

据我所知,您将无法将UIBarButtonim添加到UIPageViewController中成员视图控制器的导航栏中。原因是UIPageViewController的“navigationController”设置为nil。要确认,请打印[UIPageViewController navigationController]的值

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

并在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 =@"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委托方法

- (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;
}
不过,我不建议您这样做,因为它打破了UIPageViewController的整个概念


我希望这会有帮助

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

您可以在interface builder中创建按钮,并将其链接到
DetailViewController
中的属性,然后在每次转到新页面时使用按钮上的
UIControlStateNormal
调用
setTitle:forState


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

您可以通过在其中一个页面视图控制器中查找页面控制器,找到设置按钮/标题的正确导航项,然后得到它的导航项目。e、 g

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

self.navigationItem不起作用,真让人讨厌

mros,多亏了你的回答,我被迫尝试让委托方法适合我。在进行了一些故障排除之后,我意识到了以前尝试使用
vc.navigationItem.RightBarButtoniem
设置按钮时出现的问题。我基本上是在创建一个新的navigationItem并在其中添加一个按钮。由于navigationController的性质,新的navigationItem不会显示在其顶部。然后我意识到我可以通过委托方法将navigationItem属性从我的DetailViewController传递给我的各个页面视图控制器。谢谢Hitesh,谢谢你的意见,但我要避开这条路线!实际上,只要您的UIPageViewControllerDataSource嵌入到导航控制器中,就可以将UIBarButtonims添加到导航栏。我在问题中的示例基本上将UIPageViewController成员放置在主细节应用程序的detailViewController的顶部。这样,导航栏仍然保持不变