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.
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 queviewDidAppear
- 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. LeviewDidAppear
méthode est cependant donc, je suis en train de mettre la touche. Il est possibleviewWillAppear
est appelée à chaque fois, mais je n'ai pas vérifié.
- Cela ne fonctionnera pas car le
- 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
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin du bouton pour changer à chaque fois que vous modifiez la page que vous regardez, il doit être fait dans l'une des délégué méthodes que vous avez essayé. Toutefois, je suggère au lieu de créer un nouveau bouton et la valeur de l'élément de navigation, il vous suffit de changer le titre.
Vous pouvez créer un bouton dans l'interface builder et le lier à une propriété dans votre
DetailViewController
et ensuite appelersetTitle:forState
avecUIControlStateNormal
sur le bouton chaque fois que vous visitez une nouvelle page.Si vous avez besoin du bouton pour faire quelque chose de différent pour chaque page, je voudrais vous recommandons de consulter la page en cours dans les boutons d'action de la méthode plutôt que de déclarer un nouveau à chaque fois.
Vous pouvez trouver le bon élément de navigation pour régler les boutons/titres par trouver le contrôleur de la page dans l'une de ses paginé vue des contrôleurs, l'obtention de la valeur liquidative de ce point. par exemple,
C'est vraiment gênant que de soi.navigationItem ne fonctionne pas!
Un de mes collègues ont vécu le même problème avec la page-vue-contrôleur.
Comme je le comprends, vous ne' être en mesure d'ajouter UIBarButtonItem de la barre de navigation de vue de membre contrôleurs de UIPageViewController. Raison d'être "navigationController' est mis à zéro pour UIPageViewController. Pour confirmer, l'impression de la valeur de [UIPageViewController navigationController].
Cependant, vous pouvez faire quelque chose pour résoudre ce problème. S'il vous plaît télécharger exemple PhotoScroller.
Et de faire les changements suivants dans AppDelegate.m
Et à la suite de changements dans le PhotoViewController.m
Pour éviter le crash, vous avez à gérer UIPageViewControllerDataSource délégué méthodes correctement dans AppDelegate.m
Cependant, je ne voudrais pas vous conseiller de faire comme ci-dessus, il rompt l'ensemble du concept de UIPageViewController.
Je l'espère, ce serait utile.