1

Je suis un débutant et j'ai un projet dans lequel j'ai besoin de transmettre des données à un contrôleur enfant. Plus précisément, j'ai une vue sélecteur dans mon conteneur et je veux être capable de l'utiliser pour sélectionner une option (par exemple, pour simplifier juste une couleur à choisir parmi un tableau de dix couleurs). Ensuite, j'aimerais pouvoir accéder à la couleur choisie dans mon contrôleur de vue parent et faire quelque chose avec. J'ai fait des recherches pendant quelques jours maintenant et la réponse la plus proche à ce que je cherche, j'ai trouvé dans une question connexe sur S.O. Ici, il est:.Transmettre des données à partir du contrôleur de vue enfant

« En ce qui concerne la valeur de passage au contrôleur containerView, vous pouvez faire une propriété dans la ChildViewController de la valeur que vous voulez qu'il soit passé ensuite dans votre ParentViewController faire quelque chose comme ce qui suit:

self.ChildViewController.yourProperty = yourValue 

le contraire peut se faire de 4 façons:

Vous pouvez faire un protocole de délégué pour communiquer les données entre vos contrôleurs

Vous pouvez poster une notification dans votre ChildViewController et ajoutez le par. contrôleur en tant qu'observateur.

Vous pouvez utiliser KVO.

Et la façon la plus simple, vous pouvez faire une propriété dans votre parentviewController et accéder comme suit: »

((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant; 

Maintenant, je voudrais essayer la quatrième option d'abord comme la délégation, KVO etc. Ce que j'aurais besoin d'aide est la dernière option:

Dites que j'ai une propriété dans mon contrôleur de vue enfant où je stocke la couleur choisie:

@interface ViewController() 

@property NSString *ChosenColorInChildVC; 

@end 

Et puis, plus tard:

self.ChosenColorInChildVC = [self pickerView:myPickerView titleForRow:[myPickerView selectedRowInComponent:1] forComponent:1]]; 

comment pourrais-je transmettre cette valeur à l'aide du projet:

((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant; 

Quelqu'un peut-il muet il un peu plus loin pour moi? Merci

Répondre

4

Je vais vous expliquer avec un exemple comment fonctionne la délégation.

Modifier vos ChildViewController.h comme ceci:

@protocol ChildViewControllerDelegate; 

@interface ChildViewController : UIViewController 

@property (weak)id <ChildViewControllerDelegate> delegate; 

@end 

@protocol ChildViewControllerDelegate <NSObject > 

- (void) passValue:(UIColor *) theValue; 

@end 

Sur votre ChildViewController.m quand vous voulez passer quelque chose à la ParentViewController, faire comme ceci:

- (void) myMethod 
{ 
    [delegate passValue:[UIColor redColor]]; // you pass the value here 
} 

Sur votre ParentViewController. h

#import "ChildViewController.h" 

@interface ParentViewController : UIViewController <ChildViewControllerDelegate > // you adopt the protocol 
{ 
} 

Sur votre ParentViewController.m:

- (void) passValue:(UIColor *) theValue 
    { 
     //here you receive the color passed from ChildViewController 
    } 

Soyez prudent maintenant. Tout ne fonctionnera que si vous définissez le délégué. Ainsi, lorsque vous déclarez ChildViewController dans votre classe ParentViewController, comme cela:

ChildViewController * controller = [[ChildViewController alloc]initWithiNibName:@"ChildViewController"]; 
controller.delegate = self; //without this line the code won't work! 
+0

Salut METRONIC. Merci pour cela, ça m'a beaucoup aidé. J'ai fait tout ce que vous avez dit et (je pense) compris la logique derrière tout cela. Sauf pour le dernier bit que vous avez écrit: "Sur votre ParentViewController.m: - (void) passValue: (UIColor *) theValue {// ici vous recevez la couleur transmise par ChildViewController}" Je comprends plus ou moins l'idée derrière, mais comment cela fonctionne-t-il réellement dans la pratique? Dis que j'ai choisi le rouge dans mon récipient. comment pourrais-je y accéder chez mes parents en utilisant cette méthode? quelque chose comme: UIColor * myReceivedColor = [selfpassValue: ???]; – Paul

+0

Non, vous recevrez les données dans la méthode - (void) passValue: (UIColor *) theValue; Mettez un point d'arrêt dans cette méthode pour être sûr que cela fonctionne, vous pouvez y accéder comme ceci: UIColor * myReceivedColor = theValue; – metronic

+0

OK. Désolé pour ça. Je ne connais pas du tout le concept de «réception de valeurs» à l'intérieur d'une méthode. Donc, pour être sûr que je te comprends. Dois-je écrire quoi que ce soit à l'intérieur de la méthode - (void) passValue: (UIColor *) theValue {} dans mon Parent? Et si je veux accéder à la couleur de mes parents ... j'ai essayé d'écrire littéralement UIColor * myReceivedColor = theValue; et il revient avec "utilisé de l'identificateur non déclaré:" theValue ".J'ai aussi essayé UIColor * myReceivedValue = [selfpassValue: theValue]; – Paul

0

@metronic est juste; utiliser la délégation.

De plus généralement, vous pouvez inclure l'expéditeur dans vos méthodes de délégué:

-(void) childViewController:(ChildViewController*)viewController passValue:(UIColor*) theValue 
0

A pris note: ceci est très important.

Écrire un code de déclaration de protocole au-dessus des lignes # import, par ex.

@protocol -----

@end

import ----

@interface classname ---