2010-12-11 60 views
0

Dans l'application de création, il y a beaucoup de pages qui ressemblent la plupart du temps à une partie différente. Pour gérer ce genre de situation, j'ai créé un contrôleur de conteneur qui contient une sous-vue. Je veux que cette sous-vue soit remplie par le contenu d'un autre contrôleur (et de sa plume associée) que je créerai dynamiquement selon les besoins en fonction du contexte.Comment peut-on créer un contrôleur générique (conteneur) qui recevra en entrée un autre contrôleur

je la méthode suivante, quelque part

- (void) someAction { 
    UIViewController* contentController = [[MyContentController alloc] init]; 
    UIViewController* containerController = [[MyContainerController alloc] initWithContentController:contentController]; 
    [navigationController pushViewController:pageController animated:YES]; 
    [contentController release]; 
    [containerController release]; 
} 

Dans le contrôleur MyContainerController.mi conserver dans une propriété

- (id)initWithContentController:(UIViewController *)aContentController { 
    if ((self = [super initWithNibName:@"MyContainerController" bundle:nil])) { 
     contentController = aContentController; 
    } 
    return self; 
} 

Plus tard dans viewDidLoad i les stratégies suivantes

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [contentViewContainer addSubview:contentController.view]; 
} 

contentViewContainer est la vue qui est censée contenir les informations spécifiques à la page. Malheureusement, cela échoue avec EXC_BAD_ACCESS. La chose amusante est que si j'alloue et init le contrôleur de contenu à partir de viewDidLoad tout fonctionne. Il semble que je ne peux pas passer un contrôleur j'ai alloué à partir d'un autre endroit. Quelqu'un peut-il aider.

Répondre

0

Puisque vous publiez contentController dans le actionMethod vous devez conserver contentController en vous méthode init

- (id)initWithContentController:(UIViewController *)aContentController { 
    if ((self = [super initWithNibName:@"MyContainerController" bundle:nil])) { 

     contentController = [aContentController retain]; 
    } 
    return self; 
} 

Mais, pourquoi avez-vous besoin? Les contrôleurs sont censés contrôler les vues et aucun autre contrôleur. Si vous pensez que vous en avez vraiment besoin, vous pouvez utiliser UINavigationController ou UITabBarController. Vous pouvez également charger des vues sans un contrôleur (see here)

Personnellement, je pense que d'avoir UIViewControllers à l'intérieur de UIViewController simple n'est pas une approche préférable

Hope it helps

+0

Merci d'avoir répondu. Tout d'abord, vous avez raison de dire que ceci est similaire aux contrôleurs de barre d'outils/nav. C'est exactement la même idée, mais ils ne correspondent pas à mes besoins. Deuxièmement, n'est-ce pas exactement le but d'avoir contentController en tant que propriété avec conserver (de sorte que je n'aurais pas besoin de le conserver moi-même)? – nsof

+0

Si vous en êtes conscient (UINavigationController ou UITabBarController) et ne pensez toujours pas qu'ils sont ce que vous voulez, c'est OK. Deuxièmement, Oui, c'est comme avoir une propriété avec retenir. Si c'est le cas, vous devez le libérer dans l'implémentation de dealloc. Vous pouvez également l'affecter en tant qu'affectation, mais vous devez vous assurer que le contrôleur contenu n'est pas libéré ou que votre application se bloque à nouveau (EXC_BAD_ACCESS). Dans ce cas, il vaut mieux retenir;) – nacho4d