5

In meiner Anwendung habe ich eine RootViewController (UIPageViewController), ein FirstController (UIViewController) und ein SecondController (UIViewController). Die zwei Ansichten innerhalb der zwei UIViewControllers scrollen über den RootViewController.UIPageViewController Delegate-Methode nicht aufgerufen

In meinem RootViewController.h:

@interface RootController : UIPageViewController <UIPageViewControllerDataSource, UIPageViewControllerDelegate> 

Aber wenn ich zwischen den verschiedenen Ansichten Delegatmethoden bewegen wie:

-(void) pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 

werden nicht genannt. Warum? Kann mir jemand helfen? Vielen Dank im Voraus.

Antwort

22

Haben Sie rootViewController (je nachdem, welcher Controller/Objekt die Delegiertenaufrufe erhalten soll) als Delegat/Datenquelle des UIPageViewControllers zugewiesen?

pageViewController.delegate = rootViewController; 
pageViewController.dataSource = rootViewController; 
1

Wie haben Sie den Delegate-Ausgang des PageView-Controllers angeschlossen? Meine Vermutung ist, dass Sie den Delegiertenlink nie verbunden haben.

Es ist seltsam, einen Page View-Controller als eigene Datenquelle und Delegate zu haben. Ich habe das nie versucht, wie du es tust, und ich bin mir nicht sicher, ob es funktionieren würde. Ich habe immer einen Containeransicht-Controller eingerichtet, der den Seitenaufruf-Controller verwaltet. Mit Storyboards richten Sie einfach eine Containeransicht in IB ein und verbinden ein Embed-Segment. Dann würden Sie den Container-View-Controller zur Datenquelle und/oder zum Delegaten machen.

+0

Ich habe gerade einige Tests durchgeführt, da ich den Page View-Controller eine eigene dataSource hatte. Wenn Sie versuchen, dataSource in viewDidLoad zu setzen, werden Ihre Delegiertenmethoden niemals aufgerufen. Wenn Sie jedoch Ihre eigene Init-Methode ausführen und dataSource nach dem Aufruf der Super-Init-Methode setzen, werden die Delegate-Methoden aufgerufen. Ich mag es nicht, die Init überschreiben, also werde ich auf die Container-Ansicht-Strategie wechseln, aber dachte, ich würde andere wissen lassen, dass das eine Arbeit um –

5

Zusätzlich zu der obigen Lösung, sollten Sie bei diesem Problem die Möglichkeit in Betracht ziehen, dass der PageViewController selbst nicht beibehalten wird. Ich habe heute Abend den Fehler gemacht, einen PageViewController zu instanziieren und seine Ansicht als Unteransicht hinzuzufügen, aber nicht den PageViewController selbst beizubehalten.

Stellen Sie sicher, dass Sie es behalten, indem Sie es entweder als childViewController hinzufügen oder es einer strong-Eigenschaft zuweisen.

+0

ist Ich habe es zu einem 'UICollectionReusableView' hinzugefügt, so dass ich es nicht als ChildViewController hinzufügen konnte . Also hat es eine starke Eigenschaft zugewiesen. Danke – osrl

+0

Ich erkannte, dass ich den UIPageViewController als Methode var anstatt Instanzvariable, die das Problem für mich erstellt wurde hinzugefügt. – KarunPant75

0

Ich habe nur einige Zeit damit verbracht herauszufinden, warum didFinishAnimating nicht aufgerufen wurde. Meine Delegierten wurden eingestellt richtig, aber es stellt sich heraus, dass in Swift 3 die Funktion wie das geht:

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) 

Geist der oben Strich. Die folgende Funktion wird nicht aufgerufen.

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool)