Pour accéder setViewControllers À partir de vos contrôleurs de vue enfant, vous aurez besoin de vos contrôleurs de vue enfant pour connaître leur PageViewController parent. Pour ce faire, commencez par faire un protocole (je sais que vous avez dit que vous avez essayé les protocoles, mais s'il vous plaît, veuillez voir ma méthode). Ce protocole garantit que chaque contrôleur de vue enfant a une référence au PageViewController parent. Assurez-vous que les contrôleurs de vue enfants respectent le protocole PageObservation.
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
}
}
Dans votre PageViewController, que vous créez chaque contrôleur de vue des enfants, les jeter au type de PageObservation et passer une référence de la PageViewController mère. J'utilise un tableau appelé orderViewControllers pour créer mes pages. Mes méthodes de délégué UIPageViewControllerDataSource l'utilise pour savoir quelles pages charger mais ce n'est pas pertinent pour cet exemple, je pensais juste que je vous le ferais savoir au cas où vous auriez une manière différente de créer vos pages.
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)
}
Maintenant, dans votre contrôleur enfant, vous avez accès à setViewControllers.Par exemple, si je veux appeler setViewControllers dans le child1ViewController, j'ai créé un fonc appelé accessSetViewControllers() où j'accéder aux setViewControllers:
class Child1ViewController: UIViewController, PageObservation {
var parentPageViewController: PageViewController!
func getParentPageViewController(parentRef: PageViewController) {
parentPageViewController = parentRef
}
func accessSetViewControllers() {
parentPageViewController.setViewControllers(//do what you need)
}
}
Sur une note de côté, malgré ce que les autres réponses ci-dessus ont dit, vous pouvez Définissez dataSource comme vous le souhaitez. Il m'arrive de mettre la valeur de dataSource à zéro pour empêcher l'utilisateur de quitter un écran avant de faire quelque chose, puis d'ajouter à nouveau dataSource pour leur permettre de continuer à balayer.
Merci pour votre réponse. Mais qu'est ce que "pageViewController" dans votre code? Vous l'utilisez lors de la création des contrôleurs enfants. –
C'était une erreur, désolé. Je l'ai corrigé maintenant. – gwinyai
J'ai essayé votre solution et tout semble fonctionner! De loin la meilleure réponse trouvée en ligne! Cependant, j'ai une question: Disons que j'ai 3 contrôleurs Voir l'enfant et chacun d'eux est embeded dans leur propre contrôleur de navigation. Comment puis-je "créer les contrôleurs enfants" alors? Se référer uniquement à eux avec le contrôleur de navigation - Storyboard - ID n'a pas fonctionné. Dois-je changer autre chose? Meilleures salutations, et grand merci! –