2010-08-10 4 views
1

Je veux charger des données (un tableau de chaînes) de la vue parent dans un ensemble de UITextFields dans la vue enfant lors de la présentation de modalView.Comment passer des données de la vue parent à l'enfant lors de l'ouverture?

Je sais comment passer de l'enfant au parent, et je suis sûr que c'est encore plus facile de passer de l'autre côté, mais je ne sais pas comment.

MISE À JOUR: Mise à jour supprimée car j'ai trouvé le problème (à double libération de vue modal)

Répondre

2

Remplacer la méthode d'initialisation du contrôleur de vue des enfants.

- (id) initWithStrings:(NSArray *)string { 
    if (self = [super init]) { 
     // Do stuff.... 
    } 
    return self; 
} 

Puis dans le parent:

MyChildViewController *vc = [[[MyChildViewController alloc] initWithStrings: strings] autorelease]; 
+0

Merci! Travaillé bien, mais deux problèmes ont été soulevés. 1. Le fichier parent .m me donne un avertissement. Pas de méthode '-initWithStrings:' trouvée. Où dois-je le définir? 2. Une fois que la vue enfant est chargée et que j'ai utilisé viewDidLoad pour remplir mon UITextFields, lorsque j'appuie sur d'autres éléments de l'interface utilisateur (boutons, champs de texte), l'application se fige. (gdb) "dans ma console et mon fil 1 a beaucoup de références à" prepareForMethodLookup " Pensées? –

+0

Mettez-le dans le fichier .h trop lik: - (id) initWithStrings: (NSArray *) chaîne; –

+0

Vous n'êtes pas sûr du # 2, avez-vous reçu EXC_BAD_ACCESS? –

0

Deux façons vous pourriez le faire:

1.Override la méthode init comme Matt suggère

2.Créez champs de votre enfant classer et transmettre ces valeurs à votre champ de texte.

@interface ChildViewController : UIViewController{ 
    NSArray *strings; 
    UITextfield *textField1; 
    UITextfield *textField2; 
} 
... 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    textField1.text = [strings objectAtIndex:0]; 
    textField2.text = [strings objectAtIndex:1]; 
} 

Puis, dans la classe parente:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    ChildViewController *childController = [[ChildViewController alloc] init]; 
    childController.strings = your_array_of_strings; 
    [self.navigationController pushViewController:childController animated:YES]; 
    [childController release]; 

} 
0
- (id)initWithDataObject:(YourDataObjectClass *)dataObject { 
    if (self = [super init]) { 
     self.dataObject = dataObject; 
     // now you can do stuff like: self.myString = self.dataObject.someString; 
     // you could do stuff like that here or if it is related to view-stuff in viewDidLoad 
    } 
    return self; 
} 
0

Si vous voulez vraiment de fantaisie, vous pouvez faire un délégué pour votre point de vue de l'enfant.

@protocol MyChildViewDelegate 
- (NSArray*)getStringsForMyChildView:(MyChildView*)childView; 
@end 

@interface MyChildView : UIView 
{ 
    id <MyChildViewDelegate> delegate; 
    ... 
} 

@property (nonatomic, assign) id <MyChildViewDelegate> delegate; 
... 
@end 

Ensuite, quelque part dans votre vue, vous demanderiez les cordes:

- (void)viewDidLoad 
{ 
    ... 
    NSArray* strings = [delegate getStringsForMyChildView:self]; 
    ... 
} 

Ensuite, dans votre contrôleur (ou si jamais) vous pouvez faire:

myChildView = [[MyChildView alloc] initWith....]; 
myChildView.delegate = self; 

... 

- (NSArray*)getStringsForMyChildView:(MyChildView*)childView 
{ 
    return [NSArray arrayWithObjects:@"one", @"two", @"three", nil]; 
} 

Il est probablement un peu overkill dans ce cas, mais c'est aussi ce que fait UITableViews: ils ont un délégué de source de données pour leur fournir leur contenu.

Questions connexes