2015-07-02 8 views

Antwort

1

Sie könnten ACReuseQueue verwenden, um zu erreichen, was Sie wollen. Es bietet eine Warteschlange für die Wiederverwendung Ihrer View-Controller. Sie können die Datenquellenmethoden UIPageViewController verwenden, um einen VC aus der Wiederverwendungswarteschlange zu entfernen. Der schwierige Teil besteht darin, zu wissen, wann sie wieder in die Wiederverwendungswarteschlange gestellt werden sollen. UIPageViewController bietet keine Methode, um zu wissen, wenn dies geschieht, aber es gibt einen Weg. UIPageViewController ist eine Container-VC, die ihre untergeordneten Ansichtscontroller mithilfe der VC-Containment-APIs hinzufügt und entfernt. Ihr VC erhält didMoveToParentViewController: mit nil als Argument, wenn es aus dem UIPageViewController entfernt wird. Verwenden Sie diese Methode, um sich selbst zur Warteschlange hinzuzufügen.

7

Um dieses Problem in meinem aktuellen Projekt zu lösen, zwischenspeichern ich alle View-Controller, die als Seiten für die UIPageViewController in einem Set erstellt werden. Immer wenn der UIPageViewController einen neuen View-Controller von seiner Datenquelle anfordert, filtere ich einen unbenutzten Cache aus diesem Cache, indem ich die parentViewController-Eigenschaft überprüfe; Wenn kein nicht verwendeter View-Controller verfügbar ist, wird ein neuer View-Controller erstellt.

Mein Setup des UIPageViewController und der Cache zu diesem recht ähnlich sieht:

class MyPageViewController: UIPageViewController { 
    private var reusableViewControllers = Set<MyViewController>() 
    init() { 
     super.init(/* ... */) 
     self.dataSource = self 

     let initialViewController = self.unusedViewController() 

     // Configure the initial view controller 
     // ... 

     self.setViewControllers([ initialViewController ], 
           direction: .Forward, 
           animated: false, 
           completion: nil) 
    } 

    // This function returns an unused view controller from the cache 
    // or creates and returns a new one 
    private func unusedViewController() -> MyViewController { 
    let unusedViewControllers = reusableViewControllers.filter { $0.parentViewController == nil } 
    if let someUnusedViewController = unusedViewControllers.last { 
     return someUnusedViewController 
    } else { 
     let newViewController = MyViewController() 
     reusableViewControllers.insert(newViewController) 
     return newViewController 
    } 
    } 
} 

Die Datenquelle verwendet die gleiche Funktion einen nicht verwendeten View-Controller zu erhalten:

extension MyPageViewController: UIPageViewControllerDataSource { 
    func pageViewController(pageViewController: UIPageViewController, 
          viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
     let nextViewController = unusedViewController() 

     // Configure the next view controller for display 
     // ... 

     return nextViewController 
    } 
} 
Verwandte Themen