Comment ajouter UIBarButtonItem à NavigationBar tout en utilisant UIPageViewController

S'il vous plaît pardonnez-moi, il y a déjà une tonne de questions sur comment ajouter un UIBarButtonItem à un NavigationBar par programmation, mais j'ai juste ne peux pas sembler obtenir des solutions pour travailler dans ma situation.

Ici est la mise en page d'une simple application de test, j'ai travaillé avec apprendre le UIPageViewController.

Comment ajouter UIBarButtonItem à NavigationBar tout en utilisant UIPageViewController

J'ai l'affichage de la page de contrôleur fonctionne parfaitement avec trois viewControllers. Je voudrais à présent unique rightBarButtonItems pour chacun des contrôleurs de vue. Je peux facilement régler d'un commun barButtonItem dans le DetailViewController simplement en faisant cela.

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

self.navigationItem.rightBarButtonItem = newButton;

Étant donné que j'ai besoin d'un bouton unique pour chacune des trois pages dans le pageViewController je ne suis pas en mesure de mettre le bouton dans le detailViewController. J'ai essayé le code ci-dessus dans viewDidAppear des trois contrôleurs, mais les boutons n'apparaissent pas. J'ai également essayé de créer le bouton de la même façon, puis la configuration comme ceci avec pas de chance.

DetailViewController *vc = [[DetailViewController alloc] init];
vc.navigationItem.rightBarButtonItem = newButton;

Je sais que je suis proche d'ici, je ne suis pas sûr de la façon de spécifier j'ai besoin d'ajouter un bouton à la NavigationBar de la NavigationController qui exécute le detailViewController que mon contentViewControllers sont incorporés dans les. Toute aide serait grande, SURTOUT des EXTRAITS.

Comme une note de côté, j'ai essayé quelques autres méthodes qui sont venus problématique.

  • Réglage du bouton dans la viewDidLoad plutôt que viewDidAppear
    • Cela ne fonctionnera pas car le viewDidLoad méthode n'est pas appelée à chaque fois que vous balayez à partir d'une page à l'autre. Le viewDidAppear méthode est cependant donc, je suis en train de mettre la touche. Il est possible viewWillAppear est appelée à chaque fois, mais je n'ai pas vérifié.
  • Réglage du bouton dans la UIPageViewController délégué méthodes
    • C'est problématique si l'utilisateur retourne à travers les pages rapidement sur le bouton, ne pas changer ou ne pas apparaître.

SOLUTION

Il s'avère que j'étais proche... Plutôt que de créer le bouton dans le UIPageViewController méthodes j'ai simplement besoin de créer un navigationItem propriété dans chacun de mes trois contrôleurs de vue. Lorsque les contrôleurs sont instanciés dans le délégué méthodes j'ai tout simplement mis les navigationItem propriété est égale à celle de la detailViewController. De cette façon, dans mon viewDidApper méthodes que je pouvais créer le bouton. Puis à viewWillDisappear j'ai mis le bouton pour nil. Vous pouvez aussi créer sur le bouton viewdidLoad de la DetailViewController et modifier le texte et l'action dans viewDidAppear de l'individu viewControllers. En voici un échantillon.

Délégué méthodes

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

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

J'appelle une méthode d'aide en fonction de l'indice de la viewController. L'aide de la méthode instancie la vue des contrôleurs lorsqu'il est appelé. Une fois instancié, je définir certaines propriétés, y compris la navigationItem propriété.

-(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;

}

Puis dans le viewDidAppear de la viewController je viens de le faire

-(void)viewDidAppear:(BOOL)animated
{

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

}

source d'informationauteur Ben