UISplitViewController - mehrere detail-Ansichten mit UINavigationController

Ich die Umwandlung einer iPhone-app eine universal-app, und es ist meist geradlinig zu konvertieren, die geschachtelte Tabellen in einem UISplitViewController Anordnung, aber ich habe eine Verbleibende Problem bei der Ausführung auf einem iPad, dass verursacht mir Kopfschmerzen.

Für universal-app-Kompatibilität, die "master" - Ansicht enthält eine UINavigationController verwendet wird, um die Navigation durch eine Reihe von TableViews, dass jeder wird ein Menü angezeigt. Dies funktioniert sehr gut.

Schließlich, der Benutzer kommt auf Inhalte, die in der Detailansicht dargestellt. Jedes detail view 'Kette', die in einen UINavigationController, als einige Ansichten können einen Drilldown durchführen, um zu zeigen, Karten etc. Die Idee ist, dass der popover-Taste wird live auf der root-Ebene der detail-Ansicht. Es ist wahrscheinlich wichtig zu beachten, dass die detail-Ansichten sind von Grund auf neu erstellt jedes mal, wenn die Zeile ausgewählt ist.

Ich untersucht habe Apple Mehrere Detail-Ansicht Beispiel-Code , und so verwenden Sie die master-Ansicht als UISplitViewController Delegierten, die ermöglicht das ein - /ausblenden popover-Selektoren, und dann geht das ruft nach unten auf den niedrigeren Ersatz der detail-Ansicht ausgewählt ist.

Beim arbeiten im Querformat, ich können Sie die verschiedenen Zeilen in der master-Ansicht und detail-Ansichten wechseln, freundlich - alles Super funktioniert. Es ist wunderbar.

Im portrait-Modus, die Dinge nicht ganz so gut... die popover-Taste korrekt angezeigt, in das aktuell ausgewählte detail-Ansicht beim drehen auf hochformat, aber dann verschwindet, wenn eine Zeile ausgewählt ist (D. H. es ist irgendwie nicht korrekt Hinzugefügt, um die neu ausgewählte Ansicht die Navigationsleiste aus).

Habe ich Hinzugefügt, Diagnose-code, und es sieht aus wie das richtige telefonieren (mit der richtigen Zeiger) wird gemacht, um zu zeigen, die popover-Taste auf den neu gewählten Detailansicht. Auch kann ich drehen, um die Landschaft und wieder zurück, und die popover-Taste, dann erscheint so bin ich einigermaßen zufrieden, dass der popover UIBarButtonItem wird angeschlossen an das neue detail NavBar korrekt.

Als die detail-Ansichten werden erst erstellt, wenn die Zeile ausgewählt ist, ich Frage mich, ob dies war ein Fall von der UINavigationBar nicht instanziiert an der Zeit, dass showRootPopoverButtonItem genannt wird (basierend auf apples Beispielcode). Diese Theorie wird durch die Tatsache unterstützt, dass der popover-Taste wird angezeigt, wenn ich drehen, um die Landschaft und wieder zurück (wie oben erwähnt) mit derselben Sicht ausgewählt.

Sehe ich auch diesen Kommentar in apples Beispielcode, in didSelectRowAtIndexPath, und nur vor der Schaltung die detail-Ansichten Hinweis: die Verwendung des Wortes 'nach'...

//Configure the new view controller's popover button (after the view has been displayed and its toolbar/navigation bar has been created).

So, ich habe versucht, den Aufruf der showRootPopoverButton Methode wieder in viewWillAppear (mit der Zeit die UINavigationBar existieren sollte), aber das verursacht nicht die popover-Taste zu erscheinen.

Ich würde schätzen alle Gedanken und Vorschläge, wie man die popover-Taste, um sofort erscheinen, wenn eine neue Zeile ausgewählt ist aus der master-Ansicht, wenn im portrait-Modus. Danke.

Dank für das Lesen dieser weit, der entsprechende code ist unten.

Aus der master-Ansicht, hier sind die UISplitViewControllerDelegate Selektoren,

- (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)pc
{

    //Keep references to the popover controller and the popover button, and tell the detail view controller to show the button.
    barButtonItem.title = @"Root View Controller";
    self.popoverController = pc;
    self.rootPopoverButtonItem = barButtonItem;
    //UIViewController <SubstitutableDetailViewController> *detailViewController = [self.splitViewController.viewControllers objectAtIndex:1];

    //^ Apple's example, commented out, my equivalent code to obtain
    //active detail navigation controller below,

    UINavigationController *detailNavController = [self.splitViewController.viewControllers objectAtIndex:1];
    UIViewController *detailViewController = detailNavController.visibleViewController;

    [detailViewController showRootPopoverButtonItem:rootPopoverButtonItem];
}


- (void)splitViewController:(UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
     //Nil out references to the popover controller and the popover button, and tell the detail view controller to hide the button.
     UINavigationController *detailNavController = [self.splitViewController.viewControllers objectAtIndex:1];
     UIViewController *detailViewController = detailNavController.visibleViewController;
     [detailViewController invalidateRootPopoverButtonItem:rootPopoverButtonItem];
     self.popoverController = nil;
     self.rootPopoverButtonItem = nil;
}

Und, sehr viel wie das Apple-Beispiel, hier ist, was passiert, wenn eine Zeile ausgewählt ist, in der master-Tabelle,

if (rootPopoverButtonItem != nil)
{
    NSLog (@"show popover button");
    [newDetailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem];
}

Aus der Detailansicht

- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem
{
    NSLog (@"detailViewController (view: %p, button: %p, nav: %p): showRootPopoverButton", self, barButtonItem, self.navigationItem);

    barButtonItem.title = self.navigationItem.title;

    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:NO];

    popoverButton = barButtonItem;
}


- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem
{    
    NSLog (@"detailViewController (%p): invalidateRootPopoverButton", self);

    //Called when the view is shown again in the split view, invalidating the button and popover controller.
    [self.navigationItem setLeftBarButtonItem:nil animated:NO];

    popoverButton = nil;
}
InformationsquelleAutor Snips | 2012-02-14
Schreibe einen Kommentar