2013-03-10 11 views
28

Ich habe eine UIPageViewController, die ich Seite Daten für die Verwendung einer Implementierung von UIPageControllerDelegate und UIPageControllerDataSource bereitstellen.Refresh UIPageViewController - Seiten neu anordnen und neue Seiten hinzufügen

Es funktioniert alles gut, aber ich möchte in der Lage sein, Elemente zu den Seitendaten hinzuzufügen und die Seitendaten neu anzuordnen.

Wenn ein Benutzer bereits auf die letzte der Seiten gelangt ist, und dann ein Element hinzufügen, können sie nicht zur nächsten Seite gelangen, da viewControllerAfterViewController: bereits aufgerufen wurde. Wenn sie einen zurückblättern und dann zwei weiterleiten, können sie auf die neue Seite zugreifen, damit die Daten korrekt eingerichtet werden. Wie kann ich dem UIPageViewController sagen, seinen Laden zu aktualisieren, was als nächstes kommt?

In ähnlicher Weise möchte ich die Sammlung neu ordnen, die die Seitenansicht unterstützt. Aber wenn ich das mache, bekomme ich das gleiche Problem - die Seitenansicht wird denken, dass die nächste Seite immer noch das ist, was das letzte Mal war, als die aktuelle Seite geladen wurde.

Ich denke, ich bin auf der Suche nach etwas ähnlich wie reloadData: auf UITableView.

Antwort

23

Sie müssen setViewControllers:direction:animated:completion: anrufen.

Auch in iOS 6, aufpassen, wenn Sie UIPageViewControllerTransitionStyleScroll Stil verwenden, da es ein großer Cache-Fehler ist, wenn animated: JA ist (meine Diskussion siehe hier: UIPageViewController navigates to wrong page with Scroll transition style).

+2

Dank - die setViewControllers: Richtung: animated: Abschluss: es tat. Prost auch, um den Fehler zu erwähnen. – ssloan

76

fand ich eine Abhilfe UIPageViewController zu zwingen, über zwischengespeicherte Ansicht-Controller benachbarter Seiten, die derzeit nicht angezeigt zu vergessen:

pageViewController.dataSource = nil; 
pageViewController.dataSource = self; 

ich dies jedes Mal wenn ich ändere die Menge der Seiten. Dies hat natürlich keinen Einfluss auf die aktuell angezeigte Seite.

Mit dieser Problemumgehung vermeide ich den Cache-Fehler und kann immer noch animated:YES in setViewControllers:direction:animated:completion: verwenden.

+3

Interessant. Wo setzt du die dataSource zurück und setzt sie zurück? Vor 'setViewControllers: Richtung: animiert: Vervollständigung:', danach oder im Abschlussblock? Vielen Dank. – ernesto

+0

Eigentlich mache ich das 0,01 Sekunden nach didFinish in einem dispatch_async Block. –

+1

Scheint gut zu funktionieren, vielen Dank für Ihr Feedback! – ernesto

1

Hier ist meine komplette Implementierung von @ ortwin-gentz Antwort im didFinish Delegatmethode in Swift 2, die perfekt funktioniert für mich:

func pageViewController(
    pageViewController: UIPageViewController, 
    didFinishAnimating finished: Bool, 
    previousViewControllers: [UIViewController], 
    transitionCompleted completed: Bool 
) { 
    if !completed { return } 
    dispatch_async(dispatch_get_main_queue()) { 
     pageViewController.dataSource = nil 
     pageViewController.dataSource = self 
    } 
} 
Verwandte Themen