webentwicklung-frage-antwort-db.com.de

Aktualisieren Sie UIPageViewController - ordnen Sie Seiten neu an und fügen Sie neue Seiten hinzu

Ich habe eine UIPageViewController, die ich Seitendaten bereitstelle, um eine Implementierung von UIPageControllerDelegate und UIPageControllerDataSource zu verwenden.

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

Wenn ein Benutzer bereits die letzte der Seiten erreicht hat und dann einen Artikel hinzufüge, kann er nicht zur nächsten Seite gelangen, da viewControllerAfterViewController: bereits aufgerufen wurde. Wenn sie um eins zurückblättern und dann um zwei vorwärts blättern, können sie zur neuen Seite gelangen, damit die Daten korrekt eingerichtet werden. Wie kann ich der UIPageViewController sagen, dass sie ihren Speicher auf den neuesten Stand bringen soll?

Ebenso möchte ich die Sammlung, die die Seitenansicht unterstützt, neu ordnen. Aber wenn ich das tue, bekomme ich dasselbe Problem - die Seitenansicht wird denken, dass die nächste Seite immer noch so ist wie beim letzten Laden der aktuellen Seite.

Ich schätze, ich suche etwas Ähnliches wie reloadData: in UITableView.

33
ssloan

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

Achten Sie in iOS 6 auch darauf, ob Sie den UIPageViewControllerTransitionStyleScroll-Stil verwenden, da es einen schwerwiegenden Zwischenspeicherungsfehler gibt, wenn animated: JA ist (siehe meine Diskussion hier: UIPageViewController navigiert mit Scroll-Übergangsstil zur falschen Seite.

27
matt

Ich habe eine Problemumgehung gefunden, um UIPageViewController zu zwingen, zwischengespeicherte Ansichtscontroller benachbarter Seiten zu vergessen, die derzeit nicht angezeigt werden:

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

Ich mache das jedes Mal, wenn ich die Seiten wechsle. Das wirkt sich natürlich nicht auf die aktuell angezeigte Seite aus.

Mit dieser Problemumgehung vermeide ich den Caching-Fehler und kann weiterhin animated:YES in setViewControllers:direction:animated:completion: verwenden.

85
Ortwin Gentz

Hier ist meine vollständige Implementierung der Antwort von @ ortwin-gentz in der didFinish-Delegatenmethode in Swift 2, die für mich perfekt funktioniert:

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
    }
}
3
theory

Swift 4-Version zum Nachladen der Daten von pageviewcontroller auf die Version von @ theory.

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if !completed { return }
    DispatchQueue.main.async() {
        self.dataSource = nil
        self.dataSource = self
    }
}
0
Parion