9

Bitte vergib mir, es gibt bereits eine Menge Fragen darüber, wie ein UIBarButtonItem zu einer NavigationBar programmgesteuert hinzugefügt wird, aber ich kann einfach keine der Lösungen in meinem funktionieren Lage.Hinzufügen von UIBarButtonItem zu NavigationBar während der Verwendung von UIPageViewController

Hier ist das Layout einer einfachen Test-App, mit der ich gearbeitet habe, um den UIPageViewController zu lernen.

storyboard

Ich habe die Seite View-Controller gut mit drei einzigartigen Viewcontrollers arbeiten. Ich möchte nun einmalig rightBarButtonItems für jeden der View-Controller setzen. Ich kann einfach einen gemeinsamen barButtonItem in DetailViewController setzen, indem Sie einfach dies tun.

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

self.navigationItem.rightBarButtonItem = newButton; 

Da ich eine einzigartige Schaltfläche für jede der drei Seiten in den pageViewController brauchen bin ich nicht in der Lage auf die Schaltfläche im detailViewController einzustellen. Ich habe den Code oben in viewDidAppear der drei Controller versucht, aber die Tasten werden nicht angezeigt. Ich habe auch versucht, den Button auf die gleiche Weise zu erstellen und es dann ohne Glück zu setzen. Jede Hilfe

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

Ich weiß, ich bin hier in der Nähe, ich bin nur nicht sicher, wie ich eine Schaltfläche, um die Navigationsleiste des Navigation muß angeben, hinzuzufügen, die die detailViewController ausgeführt, dass mein contentViewControllers in eingebettet ist. Wäre besonders BESONDERS SNIPPETS.

Als eine Randnotiz habe ich ein paar andere Methoden versucht, die problematisch geworden sind.

  • Einstellung der Taste in viewDidLoad statt viewDidAppear
    • Das wird nicht funktionieren, weil die viewDidLoad Methode jedes Mal nicht genannt wird man von einer Seite zur nächsten streichen. Die viewDidAppear Methode ist jedoch so, ich versuche, den Knopf dort zu setzen. Es ist möglich, viewWillAppear wird jedes Mal aufgerufen, aber ich habe nicht überprüft.
  • die Schaltfläche in den Delegatmethoden UIPageViewController Einstellung
    • Dies ist problematisch, wenn der Benutzer durch die Seiten blättert, um schnell die Taste nicht ändern oder ausbleiben.

SOLUTION

Es stellt sich heraus, dass ich war in der Nähe ... Anstatt die Schaltfläche in den UIPageViewController Methoden zu schaffen habe ich einfach eine navigationItem Eigenschaft in jedem meiner drei View-Controller benötigt erstellen. Wenn die Controller in den Delegate-Methoden instanziiert werden, setze ich einfach die Eigenschaft navigationItem auf die von detailViewController. Auf diese Weise konnte ich in meinen viewDidApper Methoden die Schaltfläche erstellen. Dann unter viewWillDisappear setze ich den Knopf auf nil. Sie können auch einfach die Schaltfläche unter viewdidLoad der DetailViewController erstellen und den Text und die Aktion in viewDidAppear der einzelnen viewControllers ändern. Hier ist ein Beispiel.

In den Delegatmethoden

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

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

Ich nenne ein Verfahren Helfer auf dem Index des Viewcontroller basiert. Die Hilfsmethode instanziiert die View-Controller beim Aufruf. Nach der Instanziierung habe ich einige Eigenschaften einschließlich der Eigenschaft navigationItem festgelegt.

-(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 den viewDidAppear des Viewcontroller ich gerade dieser

-(void)viewDidAppear:(BOOL)animated 
{ 

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

} 
+0

Was ist die Eigenschaft navItem auf Ihren ViewControllern? –

+0

Tolle Lösung :-) – Fabrizio

Antwort

1

Wenn Sie die Schaltfläche jedes Mal ändern müssen, wenn Sie die betrachtete Seite ändern, muss dies in einer der Delegate-Methoden geschehen, die Sie ausprobiert haben. Ich schlage jedoch vor, dass Sie anstatt einen neuen Knopf zu erstellen und ihn zum Navigationspunkt zu setzen, einfach den Titel ändern.

Sie können die Schaltfläche im Interface Builder erstellen und mit einer Eigenschaft in Ihrer DetailViewController verknüpfen und dann setTitle:forState mit UIControlStateNormal auf der Schaltfläche jedes Mal aufrufen, wenn Sie auf eine neue Seite gehen.

Wenn Sie die Schaltfläche benötigen, um für jede Seite etwas anderes zu tun, würde ich empfehlen, die aktuelle Seite in der Methode buttons action zu überprüfen, anstatt jedes Mal eine neue zu deklarieren.

+1

mros, dank deiner antwort war ich gezwungen zu versuchen, die delegate-methoden für mich arbeiten zu lassen. Nach einiger Fehlersuche erkannte ich das Problem mit meinen früheren Versuchen, die Schaltfläche mit Dingen wie 'vc.navigationItem.rightBarButtonItem' zu setzen. Ich habe im Wesentlichen ein neues Navigationselement erstellt und eine Schaltfläche hinzugefügt. Aufgrund der Beschaffenheit des navigationControllers erscheint das neue navigationItem nicht über dem Navigationsbereich. Dann erkannte ich, dass ich die navigationItem -Eigenschaft von meinem DetailViewController über die Delegate-Methoden einfach an meine individuellen Seitenaufruf-Controller übergeben konnte. Vielen Dank! – Ben

0

Einer meiner Kollegen das gleiche Problem mit Seite-View-Controller erfahren.

Soweit ich verstehe, können Sie UIBarButtonItem nicht zur Navigationsleiste von Elementansichtscontrollern in UIPageViewController hinzufügen. Grund dafür ist, dass 'navigationController' für UIPageViewController auf Null gesetzt ist. Bestätigen Sie den Wert von [UIPageViewController navigationController].

Sie können jedoch eine Sache tun, um dieses Problem zu beheben. Bitte laden Sie das Beispiel PhotoScroller herunter.

Und tun folgende Änderungen in 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; 
} 

Und folgende Veränderungen im PhotoViewController.m

- (void)loadView 
{ 
..... 
..... 
self.title [email protected]"Frogs"; 
UIBarButtonItem *newButton = [[UIBarButtonItem alloc] initWithTitle:@"Something" style:UIBarButtonItemStylePlain target:self action:@selector(doSomething)]; 

[newButton setTintColor:[UIColor redColor]]; 
self.navigationItem.rightBarButtonItem = newButton; 
} 

Absturz zu vermeiden, müssen Sie UIPageViewControllerDataSource Delegatmethoden richtig in AppDelegate.m Griff

Allerdings würde ich nicht empfehlen, das oben zu tun, da es das ganze Konzept von UIPageViewController bricht.

Ich hoffe, das wäre hilfreich.

+0

Hitesh, vielen Dank für Ihre Eingabe, aber ich werde diese Route vermeiden! Sie können der navBar tatsächlich UIBarButtonItems hinzufügen, solange Ihre UIPageViewControllerDataSource in einen Navigationscontroller eingebettet ist.Das Beispiel, das ich in meiner Frage habe, legt die UIPageViewController-Mitglieder im oberen Teil des detailViewControllers einer Master-Detail-Anwendung. Auf diese Weise bleibt die Navigationsleiste aktiv. Ich hatte es versäumt, die Eigenschaft navigationItem des detailViewControllers an meine pageViewController-Mitglieder zu übergeben. Sobald dies erkannt wurde, war es eine einfache Aufgabe! Danke nochmal – Ben

1

Sie können das richtige Navigationselement zum Einstellen von Tasten/Titeln finden, indem Sie den Seitencontroller in einem seiner Seitensteuerungs-Controller suchen und dann dessen Navigationselement abrufen. z.B.

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

Es ist wirklich ärgerlich, dass self.navigationItem nicht funktioniert!

Verwandte Themen