web-dev-qa-db-fra.com

Storyboard et init personnalisé

J'ai récemment essayé de travailler avec le MainStoryboard.storyboard dans Xcode et jusqu'à présent ça va plutôt bien et je me demande pourquoi je ne l'ai jamais utilisé auparavant. En jouant avec du code, je suis tombé sur un obstacle et je ne sais pas comment résoudre ce problème.

Lorsque j'alloue et initie un nouveau ViewController (avec un init personnalisé que j'ai déclaré dans la classe ViewControllers), je fais quelque chose comme ceci:

ViewController *myViewController = [[ViewController alloc] initWithMyCustomData:myCustomData];

Ensuite, je pourrais faire quelque chose comme:

[self presentViewController:myViewController animated:YES completion:nil];

Lorsque je travaille avec un storyboard, j'ai appris que le passage à un ViewController autonome nécessite un identifiant.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"];
[self presentViewController:myViewController animated:YES completion:nil];

Comment puis-je toujours utiliser mon initialisation personnalisée pour myViewController tout en utilisant un storyboard?

Est-ce correct de faire quelque chose comme ça:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"];
myViewController.customData = myCustomData;
[self presentViewController:myViewController animated:YES completion:nil];




//MyViewController.m
- (id) initWithMyCustomData:(NSString *) data {
if (self = [super init]) {
    iVarData = data;
}
return self;
}
26
Mark Molina

Je voudrais simplement créer une méthode qui effectue le chargement de données personnalisé.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"];
[myViewController loadCustomData:myCustomData];
[self presentViewController:myViewController animated:YES completion:nil];

Si toute votre méthode initWithCustomData ne définit qu'une seule variable d'instance, vous devez simplement la définir manuellement (pas d'inits personnalisés ou de méthodes supplémentaires requises):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"];
myViewController.iVarData = myCustomData;
[self presentViewController:myViewController animated:YES completion:nil];
18
carloabelli

Vous pouvez instancier viewcontroller dans la méthode -init.

 - (instancetype)init
 {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

   self = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

   if(self)
   {
    //default initialization

   }
   return  self;
 }

et dans votre méthode d'initialisation personnalisée

 - (instancetype)initWithImages:(NSArray *)images
 {
   self = [self init];

   if(self)
   {
     self.images = images;
   }

   return  self;
 }
17
Tahir Iqbal

Ma version:

- (instancetype)initWithData (NSArray *)someData
 {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

   self = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

   if(self)
   {
    //default initialization

   }
   return  self;
 }

... un initialiseur;)

2
Tash Pemhiwa