2009-04-01 7 views
3

Fournissez quelques conseils pour vous débarrasser du scénario suivant.Comment accéder aux objets d'un ViewController à un autre ViewController

Description:

J'ai deux viewControllers savoir ViewController1 et ViewController2, donc nous avons obiviously ViewController1.h, ViewController1.m et ViewController2.h, ViewController2.m . Maintenant, je déclare une

NSString *string1; 

dans ViewController1.h et déclarée comme une propriété

@property(nonatomic,retain) NSString *string1; 

et synthétisé dans ViewController1.m comme

@synthesize string1; 

et ViewController1.m, j'ai réglé la valeur chaine1 comme

[email protected]"Hello Every One"; 

De même, je déclare

NSString *string2; 

dans ViewController2.h et a déclaré comme une propriété

@property(nonatomic,retain)NSString *string2; 

et synthétisé dans ViewController2.m comme

@synthesize string2; 

Si je veux définir la valeur string1 (en ViewController1.m) à string2 (en ViewController2.m), comment puis-je faire?

Répondre

3

Cela dépend de l'endroit où le code dans lequel vous souhaitez définir string1 est en cours d'exécution. Si c'est dans une classe extérieure avec accès aux deux objets contrôleur de vue, c'est simple. Si vous avez l'objet ViewController1 VC1 et VC2 objet ViewController2, tout ce que vous faites est:

[vc1 setString1:[vc2 string2]]; 

Si vous souhaitez définir chaine1 à partir du code exécuté dans ViewController2, vous utilisez le mécanisme de notification.Dans la routine d'initialisation de ViewController1, vous mettez:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(aChangeStringMethod:) name:@"anyStringJustMakeItUnique" object:nil]; 

Et définir:

-(void)aChangeStringMethod:(NSNotification)notification{ 
    string1 = [((ViewController2 *)[notification object]) string2]; 
} 

Puis, en ViewController2, lorsque vous voulez changer la chaîne:

[[NSNotificationCenter defaultCenter] postNotificationName:@"anyStringJustMakeItUnique" withObject:self]; 

La même technique est utilisée lorsque vous changez la chaîne d'une troisième classe qui a accès à vc2 mais pas à vc1. Code ViewController1 est le même que ci-dessus, et quand vous voulez changer la chaîne:

[[NSNotificationCenter defaultCenter] postNotificationName:@"anyStringJustMakeItUnique" withObject:vc2]; 

La partie la plus délicate est que si vous voulez changer la chaîne à partir de ViewController1 (en supposant que vous n'avez pas accès à l'objet vc2). Vous devez utiliser deux notifications: celui ci-dessus, et aussi, pour ViewController2:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(launchTheOtherNotificationMethod:) name:@"anotherNotificationName" object:nil]; 

-(void)launchTheOtherNotificationMethod:(NSNotification)notification{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"anyStringJustMakeItUnique" withObject:self]; 
} 

Ensuite, lorsque vous voulez changer la chaîne:

[[NSNotificationCenter defaultCenter] postNotificationName:@"anotherNotificationName" withObject:nil]; 

Si vous pensez que cela est trop complexe ou les causes trop de frais généraux, la solution la plus simple est d'avoir, comme les champs dans ViewController1 et ViewController2, des pointeurs les uns aux autres. Puis, dans ViewController1:

string1 = [myVC2 string2]; 

Et si vous faites ces propriétés des champs, puis, de l'extérieur:

[vc1 setString1:[[vc1 myVC2] string2]]; 

Et même:

[[vc2 myVC1] setString1:[vc2 string2]]; 
0

Vous pouvez utiliser un objet de modèle qui contient les deux chaînes et qui est connu par les deux contrôleurs.

Si vous souhaitez que chaque contrôleur soit averti lorsque l'autre met à jour la valeur des chaînes, vous pouvez utiliser notification mechanism. Cela permet à votre modèle de laisser d'autres objets connaître ses changements et de rester indépendant de ces objets.

1

viewControllers sont une pile, donc selon l'un d'entre eux appelé dernier est au sommet de la pile, et celui auquel il a été appelé est son parent. Donc, en supposant viewController1 est appelée d'abord, puis viewController2 est appelée à partir de cela, tout ce que vous avez à l'intérieur viewController2.m est:

[[self parentViewController] setString1:string2] 

: D

Questions connexes