2010-11-22 6 views
0

J'ai un View Controller qui initialise un UIView comme vue. Cette vue initialise un autre UIView en tant que sous-vue. Les deux UIViews communiquent avec View Controller via un délégué/protocole.Comment partager des valeurs entre deux instances de View Controller?

Chaque UIView crée une instance de la ViewController et le rend égal au délégué:

ViewController *aDelegate = [[ViewController alloc] init]; 
self.delegate = aDelegate; 

PROBLÈME: Le View Controller a une variable appelée (int) sélection qui est modifiée par les deux UIViews. Les deux vues doivent savoir comment l'autre a modifié la variable, mais comme chacune a une instance différente du View Controller, cette communication est impossible. Comment pourrais-je résoudre ce problème?

Merci une tonne

EDIT: Peter mentionné attribuer le délégué à la création de vues que j'aime, mais comment pourrais-je faire pour la sous-vue depuis sa création dans le UIView et non le contrôleur View. PS. En réalité, il s'agit d'une sous-vue d'une sous-vue d'une sous-vue. Puis-je les créer toutes dans le View Controller, puis l'affecter en tant que délégué?

Essayé assigner le délégué comme suit, mais il se bloque sans cesse lorsque je tente d'appeler une méthode ViewController de la vue:

MyView *mainView = [[MyView alloc] initWithFrame:frame]; 
self.view = mainView; 
mainView.delegate = self; 
[mainView release]; 
+0

Vous voudrez probablement inverser l'approche. Avoir un seul ViewController et deux UIViews. – joshpaul

+0

C'est ce que j'ai, un contrôleur de vue avec un uiview qui a une sous-vue – John

+0

duplication possible de: http://stackoverflow.com/q/3185760/40175 – Akusete

Répondre

0

Les vues n'ont pas besoin de connaître l'autre. Dans votre contrôleur de vue que vous définissez une propriété pour la sous vue

@property (nonatomic, retain) MyView *myView;

Ensuite, vous créez votre sous vue et d'assigner le délégué. Cela peut se faire dans viewDidLoad

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    CGRect frame = ...; 
    MyView *subView = [[MyView alloc] initWithFrame:frame]; 
    self.myView = subView; 
    subView.delegate = self; 
    [self.view addSubView:subView]; 
    [subView release]; 


    self.view.delegate = self; 
} 

Ensuite, dans votre méthode déléguée, que je viens de devinais comment il pourrait regarder, vous pouvez mettre à jour le contrôleur de vue ainsi que l'autre point de vue.

- (void)view:(MyView *)view didUpdateSelection:(int)newSelection { 
    self.selection = newSelection; 
    if (view == self.view) { 
     self.myView.selection = newSelection; 
    } 
    else { 
     self.view.selection = newSelection; 
    } 
} 
0

On dirait plutôt que de chaque point de vue allouer une instance distincte du contrôleur de vue, vous voulez affecter l'instance du contrôleur de vue qui a créé les vues en tant que délégué de chaque vue. Une manière d'aborder cela consiste à faire en sorte que le contrôleur de vue s'affecte lui-même en tant que délégué de la vue lorsqu'il crée la vue.

+0

Génial, comment puis-je faire cela pour la sous-vue cependant? – John

+0

Une option consiste à créer toutes les sous-vues dans le contrôleur de vue et affecter les délégués, comme vous l'avez mentionné ci-dessus dans votre édition. –

+0

J'ai essayé cela, mais il continue de s'écraser, fait l'édition ci-dessus avec ce que j'utilise. Encore merci pour l'aide jusqu'à présent. – John

Questions connexes