2014-01-29 3 views
17

ich jedes Tutorial gelesen habe ich über UIPageViewController gefunden, aber sie zeigen nur Grundlagen, würde Ich mag so etwas wie neue Twitter-App erstellen hat:UIPageViewController innerhalb Navigation

enter image description here

UIPageViewController eingebettet ist Im Navigations-Controller basiert der Titel der Navigationsleiste auf der aktuellen Seite und diese Seitenpunkte sind ebenfalls vorhanden. Der Benutzer kann auf das Element auf der aktuellen Seite (Element aus der Tabellen-/Sammlungsansicht) tippen, um Details anzuzeigen.

Ich war in der Lage, mit etwas Ähnliches zu kommen, jede Seite hatte Sammlungsansicht, und die Details eines Elements in der Navigationsleiste angezeigt wurde, gab es korrekte Titel und "<" -Taste, aber ich konnte nicht ändern Titel basierend auf der aktuell angezeigten Seite

Bitte, könnten Sie mir beschreiben, wie man das in wenigen Schritten/Grundaufbau der Controller macht?

+1

Wie haben Sie die Punkte in der Navigationsleiste erhalten? :) –

Antwort

14

Ich weiß nicht, ob Sie noch daran arbeiten, aber hier geht es trotzdem. Um einen UIPageViewController einzurichten, können Sie das Tutorial und zwei Fragen verwenden.

http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/

How to implement UIPageViewController that utilizes multiple ViewControllers

How to add UIBarButtonItem to NavigationBar while using UIPageViewController

Das letzte Glied auf speziell auf den Inhalt der navigationbar Einstellung bezieht sich je nachdem, was Sie sehen.

Der Schlüssel besteht darin, eine UINavigationItem-Eigenschaft in der .h-Datei Ihres UIPageViewController-Inhaltsansicht-Controllers zu erstellen, dh diejenigen, die anzeigen, was auch immer Sie anzeigen.

Von meinem Code in FirstViewController.hSecondViewController.h und ThirdViewController.h

@property (strong, nonatomic) UINavigationItem *navItem; 

In den zweiten und dritten Links oben werden Sie ein Storyboard Layout einer Master-Detail-Anwendung sehen (die einen Navigation-Controller verwendet). Die UIPageViewControllerDataSource ist die DetailViewController. Die drei mit pageViewController verbundenen Seiten sind meine Inhaltsansicht-Controller.

In DetailViewController.m müssen Sie die contentViewControllers irgendwo instanziieren. An diesem Punkt übergeben Sie die DetailViewControllers navigationItem-ID an die Inhaltsansicht-Controller. So instanziiere ich meine Inhaltsansicht-Controller mithilfe der Delegate-Methoden von UIPageViewController.

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

    NSString * ident = viewController.restorationIdentifier; 
    NSUInteger index = [_vc indexOfObject:ident]; 

    if ((index == 0) || (index == NSNotFound)) { 
     return nil; 
    } 

    index--; 

    if (index == 0) { 
     return [self controllerAtIndex:index]; 
    }else if (index == 1){ 
     return [self secondControllerAtIndex:index]; 
    }else if (index == 2){ 
     return [self thirdControllerAtIndex:index]; 
    }else{ 
     return nil; 
    } 
} 

Die Delegate-Methode ruft die folgende Methode auf. Es ist fast direkt von der Tutorial-Link mit nur ein paar Änderungen.

-(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; 
} 

Hinweis, dass die Eigenschaften in den View-Controller einschließlich self.navigationItem geben werden. Wenn Sie es übergeben, können Sie Änderungen an den navigationBar-Elementen vornehmen.

Dann in der viewDidAppear Methode Ihrer Content-View-Controller können Sie einfach den Titel auf der Navigationsleiste wie folgt festlegen.

navItem.navigationItem.title = @"Whatever you want the title to be"; 

Es ist wichtig, heißt der Bildschirm erscheint jedes Mal, nicht viewDidAppear weil viewDidLoad zu verwenden. Ich glaube, der UIPageViewController speichert die Seite vor und die Seite nach dem, was Sie gerade sehen, wodurch das System die Seite nicht jedes Mal laden muss, wenn Sie dorthin navigieren.

Wenn Sie einen einzelnen View-Controller für alle Ihre Seiten wie das Tutorial verwenden, müssen Sie die Eigenschaft index verwenden, um zu wissen, worauf Sie den Titel setzen sollen.

Hoffe, das hilft!

+0

Hallo, vielen Dank! Ich habe das Layout der GUI geändert, aber ich bin sicher, dass es für mich eines Tages nützlich sein wird :) –

+4

Sie können die zusätzliche Eigenschaft vermeiden, indem Sie den Seitencontroller im laufenden Betrieb finden: 'UIViewController * child = [[self.navigationController childViewControllers] lastObject]; child.navigationItem.title = @ "Mein Titel"; ' –

5

Ich hatte eine sehr ähnliche Einstellung und löste das Problem.

Mein Setup ist, dass ich einen UIPageViewController in einem UINavigationController habe, weil ich wollte, dass die Navigationsleiste persistent ist, während ich zwischen jedem View-Controller swiped. Ich wollte den Titel des aktuellen UIViewController innerhalb des UIPageViewControllers zum Titel des UINavigationControllers machen.

Der Weg, dies zu tun, ist die Implementierung der UIPageViewControllerDelegate Methode pageViewController didFinishAnimating, die ausgelöst wird, nachdem eine Änderung zu einem View-Controller von der UIPageViewController gemacht wird. Sie können wahrscheinlich sehen, wohin das geht: Legen Sie hier die Eigenschaft navigationItem.title des UIViewPageControllers fest, die der UINavigationController verwendet, um seinen eigenen Titel mit dem des Titels des aktuellen View-Controllers festzulegen.

Beispiel:

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 
{ 
    if(finished && completed) 
    { 
     NSString *titleOfIncomingViewController = [[pageViewController.viewControllers firstObject] title]; 
     pageViewController.navigationItem.title = titleOfIncomingViewController; 
    } 
} 

NB: Diese Delegatmethode triggert nur off Geste initiierte scrollt.

+0

Ich bin in dieser exakten Situation. Ihre Lösung funktioniert gut, aber ich möchte, dass der Titel auch für den ersten View-Controller angezeigt wird. Hast du einen Weg gefunden, um das zu umgehen? – Isuru

+0

Es tut mir leid, was meinst du mit "First View Controller"? Du meinst den Anfang, dass es eins ist, also hat es diese Methode nicht ausgelöst? – micnguyen

0

Herr Isuru! Ich habe Ihre Frage ... Lösung von Mr. Micnguyen ist die genaue Lösung, aber die erwähnte Delegate-Methode (didFinishAnimating()) wird aufgerufen, wenn Swipe-Aktion, aufgrund der zunächst Titel nicht angezeigt wird getan wird.

daher, dieses Problem zu lösen, müssen wir zu ihrem Anfangswert in viewDidLoad() Methode der UIPageViewController Klasse gesetzt, wie unten erwähnt:

  • (void) viewDidLoad() { self.navigationitem.title = arrayname [0]; }

Dank!