So fügen Sie UIBarButtonItem zur Navigationsleiste hinzu, während Sie UIPageViewController verwenden
Bitte verzeihen Sie, es gibt bereits eine Menge Fragen zum programmgesteuerten Hinzufügen eines UIBarButtonItems zu einer Navigationsleiste, aber ich kann anscheinend keine Lösung für meine Situation finden.
Hier ist das Layout einer einfachen Test-App, mit der ich den UIPageViewController gelernt habe.
Ich habe den Seitenaufruf-Controller, der gut mit drei einzigartigen viewControllern zusammenarbeitet. Ich möchte jetzt einmalig setzenrightBarButtonItems
für jeden der Ansichtscontroller. Ich kann leicht eine gemeinsame einstellenbarButtonItem
in demDetailViewController
indem Sie dies einfach tun.
UIBarButtonItem *newButton = [[UIBarButtonItem alloc] initWithTitle:@"Whatever"
style:UIBarButtonItemStylePlain
target:self
action:@selector(doSomething)];
self.navigationItem.rightBarButtonItem = newButton;
Voraussetzung ist, dass ich für jede der drei Seiten im Internet einen eigenen Button benötigepageViewController
Ich kann den Button im nicht setzendetailViewController
. Ich habe den obigen Code in ausprobiertviewDidAppear
der drei Controller, aber die Schaltflächen werden nicht angezeigt. Ich habe auch versucht, die Schaltfläche auf die gleiche Weise zu erstellen und sie dann ohne Glück so einzustellen.
DetailViewController *vc = [[DetailViewController alloc] init];
vc.navigationItem.rightBarButtonItem = newButton;
Ich weiß, dass ich hier in der Nähe bin. Ich bin mir nur nicht sicher, wie ich festlegen soll, dass der Navigationsleiste des Navigationscontrollers eine Schaltfläche hinzugefügt werden muss, auf der der DetailViewController ausgeführt wird, in den meine ContentViewController eingebettet sind. Jede Hilfe wäre ESPECIALLY SNIPPETS.
Als Randnotiz habe ich ein paar andere Methoden ausprobiert, die problematisch aufgetaucht sind.
Einstellen der Taste inviewDidLoad
eher, alsviewDidAppear
Dies wird nicht funktionieren, da dieviewDidLoad
Die Methode wird nicht jedes Mal aufgerufen, wenn Sie von einer Seite zur nächsten wischen. DasviewDidAppear
Methode ist jedoch, also versuche ich, den Knopf dort einzustellen. Es ist möglichviewWillAppear
wird jedes Mal aufgerufen, aber ich habe nicht überprüft.Festlegen der Schaltfläche in den UIPageViewController-DelegatmethodenDies ist problematisch, wenn der Benutzer schnell durch die Seiten blättert und die Schaltfläche sich nicht ändert oder nicht angezeigt wird.LÖSUNG
Es stellte sich heraus, dass ich nah dran war ... Anstatt die Schaltfläche in den UIPageViewController-Methoden zu erstellen, musste ich einfach eine erstellennavigationItem
Eigenschaft in jedem meiner drei Ansichtscontroller. Wenn die Controller in den Delegate-Methoden instanziiert werden, setze ich einfach die navigationItem-Eigenschaft auf die des detailViewController. Auf diese Weise in meinemviewDidApper
Methoden könnte ich den Button erstellen. Dann umviewWillDisappear
Ich stelle den Knopf aufnil
. Sie können die Schaltfläche auch einfach unter erstellenviewdidLoad
desDetailViewController
und ändern Sie den Text und die Aktion inviewDidAppear
der einzelnen viewController. Hier ist ein Beispiel.
In den Delegate-Methoden
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
Ich rufe eine Hilfsmethode auf, die auf dem Index des viewControllers basiert. Die Hilfsmethode instanziiert die Ansichtscontroller, wenn sie aufgerufen wird. Nach der Instanziierung habe ich einige Eigenschaften festgelegt, einschließlich der Eigenschaft 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;
}
Dann in derviewDidAppear
des viewcontrollers mache ich einfach so
-(void)viewDidAppear:(BOOL)animated
{
UIBarButtonItem *newButton = [[UIBarButtonItem alloc]
initWithTitle:@"Whatever" style:UIBarButtonItemStylePlain target:self action:@selector(doSomething)];
navItem.rightBarButtonItem = newButton;
}