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, alsviewDidAppearDies 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;

}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage