Um setViewControllers zugreifen Von den untergeordneten Ansichtscontrollern müssen die untergeordneten Ansichtscontroller auf ihren übergeordneten PageViewController achten. Beginnen Sie dazu mit dem Erstellen eines Protokolls (ich weiß, Sie haben gesagt, Sie haben Protokolle ausprobiert, aber bitte sehen Sie meine Methode durch). Dieses Protokoll stellt sicher, dass jeder untergeordnete Ansichtscontroller einen Verweis auf den übergeordneten PageViewController hat.
Stellen Sie sicher, dass Ihre untergeordneten Ansichtscontroller das PageObservation Protocol einhalten.
class Child1ViewController: UIViewController, PageObservation {
var parentPageViewController: PageViewController!
func getParentPageViewController(parentRef: PageViewController) {
parentPageViewController = parentRef
}
}
class Child2ViewController: UIViewController, PageObservation {
var parentPageViewController: PageViewController!
func getParentPageViewController(parentRef: PageViewController) {
parentPageViewController = parentRef
}
}
In Ihrem PageViewController, wie Sie jedes Kind-View-Controller zu erstellen, warf sie auf den PageObservation Typ und eine Referenz des Mutter PageViewController passieren. Ich verwende ein Array namens orderViewControllers, um meine Seiten zu erstellen. Meine UIPageViewControllerDataSource-Delegatmethoden verwenden diese, um zu wissen, welche Seiten geladen werden sollen, aber das ist für dieses Beispiel irrelevant. Ich dachte nur, ich würde Sie darüber informieren, falls Sie Ihre Seiten auf andere Weise erstellen.
class PageViewController: UIPageViewController {
var orderedViewControllers: [UIViewController] = []
//creating child 1
//i am using storyboard to create the child view controllers, I have given them the identifiers Child1ViewController and Child2ViewController respectively
let child1ViewController = UIStoryboard(name: "Main", bundle: nil) .
instantiateViewController(withIdentifier: "Child1ViewController")
let child1WithParent = child1ViewController as! PageObservation
child1WithParent.getParentPageViewController(parentRef: self)
orderedViewControllers.append(child1ViewController)
//creating child 2
let child2ViewController = UIStoryboard(name: "Main", bundle: nil) .
instantiateViewController(withIdentifier: "Child2ViewController")
let child2WithParent = child2ViewController as! PageObservation
child2WithParent.getParentPageViewController(parentRef: self)
orderedViewControllers.append(child2ViewController)
}
Jetzt in Ihrem Kind View-Controller haben Sie Zugriff auf setViewControllers.Zum Beispiel, wenn ich setViewControllers im child1ViewController nennen wollen, habe ich eine func genannt accessSetViewControllers() erstellt, wo ich die setViewControllers Zugang:
class Child1ViewController: UIViewController, PageObservation {
var parentPageViewController: PageViewController!
func getParentPageViewController(parentRef: PageViewController) {
parentPageViewController = parentRef
}
func accessSetViewControllers() {
parentPageViewController.setViewControllers(//do what you need)
}
}
Auf einer Seite zur Kenntnis, ungeachtet dessen, was andere Antworten oben gesagt haben, können Sie Setzen Sie dataSource auf was auch immer Sie möchten. Ich setze manchmal dataSource auf Null, um zu verhindern, dass der Benutzer von einem Bildschirm wegwischt, bevor er etwas unternimmt, und fügt dann die dataSource zurück, damit sie weiter wischen können.
Danke für Ihre Antwort. Aber was ist "pageViewController" in Ihrem Code? Sie verwenden es beim Erstellen der untergeordneten Controller. –
Es war ein Fehler, sorry. Ich habe es jetzt korrigiert. – gwinyai
Ich habe deine Lösung versucht und alles scheint zu funktionieren! Bei weitem die beste Antwort online gefunden! Allerdings habe ich noch eine Frage: Nehmen wir an, ich habe 3 Child View Controller und jeder von ihnen ist in einem eigenen Navigation Controller eingebettet. Wie kann ich dann die Kindercontroller erstellen? Nur mit dem Navigation Controller - Storyboard - ID zu arbeiten, hat nicht funktioniert. Muss ich noch etwas ändern? Mit freundlichen Grüßen und große Danke! –