2010-11-22 2 views
3

J'ai une application avec un UINavigationController qui contient une sous-classe racine UIViewController (PagingViewController) qui gère et agit en tant que délégué pour une UIScrollView de pagination horizontale. Sur chacune des pages de ce UIScrollView, il y a un UITableView à défilement vertical, chacun étant géré par sa propre sous-classe UIViewController (PageViewController). Il ressemble à quelque chose comme ça ...UIViewController imbriqué doit pousser sur la racine UINavigationController

UINavigationController 
    PagingViewController (root VC of navigation controller) 
    PageViewController (instance 1) 
    PageViewController (instance 2) 
    PageViewController (instance 3) 

    HowToPushThisViewController (this is what I'd like to push onto the current root, PagingViewController, from one of its sub view controllers) 

Ce que je voudrais faire est, dans la didSelectRowAtIndexPath: méthode du PageViewController (délégué UITableView), appuyez une nouvelle UIViewController sur le UINavigationController (au-dessus de la PagingViewController).

Le problème est que la propriété navigationController du PageViewController est nulle, donc je ne peux pas l'y pousser. Je suppose que c'est nul parce que ce n'est pas DIRECTEMENT sur la pile UINavigationController, mais contenait par le PagingViewController qui est sur la pile. J'ai essayé de définir la propriété navigationController de chaque PageViewController avant de l'ajouter à PagingScrollView, mais il semble être en lecture seule (Comment UINavigationController se configure-t-il?). J'ai l'impression que l'UIViewControllers imbriqué est une architecture sonore (chacun est nécessaire pour gérer et agir en tant que délégué pour ses vues), et il est raisonnable de vouloir pousser la navigation à partir d'un contrôleur secondaire, donc je ne suis pas sûr du meilleur pratique pour accéder et pousser depuis le contrôleur imbriqué. J'espère qu'il y a quelque chose de simple que je néglige d'accéder et de pousser sur le contrôleur de navigation racine.

Répondre

2

La chose logique à faire serait de définir la propriété parentViewController du contrôleur de vue de page, mais hélas, elle est également en lecture seule. Apple n'encourage pas les hiérarchies personnalisées de contrôleurs de vue (outre les hiérarchies prises en charge avec les contrôleurs de barre d'onglets, de navigation et de vue partagée).

Dans votre cas, je définirais une propriété personnalisée parentVC sur la classe PageViewController que le PagingViewController se définit lorsqu'il instancie ses enfants. Les PageViewController peuvent alors accéder au contrôleur de navigation via

self.parentVC.navigationController 
+0

Vous pouvez également remplacer '-parentViewController'. Cela semble permettre à une partie de la magie de UIViewController de fonctionner, y compris (je pense) -navigationController. Icky, cependant! –

Questions connexes