web-dev-qa-db-fra.com

méthode d'initialisation personnalisée uiviewController avec storyboard

je n'arrive pas à écraser la méthode d'initialisation de mon CustomViewController conçu dans mon Storyboard.

maintenant je fais (dans mon mainViewController):

self.customViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"CustomVC"];
self.customViewController.myObject = someObject;

et j'ai dans viewDidLoad (CustomViewController)

    [self.label setText:self.myObject.someString];

Cela fonctionne bien.

Mais est-ce la bonne façon? Devrais-je ajouter une méthode d'initialisation personnalisée (ou une substitution) à mon CustomViewController? Comme initWithObject:? Je ne sais pas comment appeler ma méthode d'initialisation personnalisée à la place de UIStoryboard instantiateViewControllerWithIdentifier:, et je ne reçois pas d'appels à init ni initWithNibName.

Peut-être que je devrais utiliser: - (id)initWithCoder:(NSCoder *)decoder

S'il vous plaît donnez-moi un conseil!

Je vous remercie!

50
Nicolas S

L'initialiseur désigné pour les contrôleurs de vue dans les storyboards est -initWithCoder:. Étant donné que la plupart des contrôleurs de vue d'un storyboard sont créés via des étapes, vous voyez généralement l'état défini au cours de -prepareForSegue:sender:.

Si vous instanciez un contrôleur de vue directement à partir du storyboard, comme dans l'exemple que vous avez fourni, le modèle que vous avez sélectionné est approprié.

58
retainCount

Comme autre solution de contournement pour ce problème, vous pouvez utiliser la délégation. Créez un protocole qui servirait de source de données pour votre sous-classe UIViewController à partir du storyboard. Conformez-vous à ce protocole de source de données, implémentez-le et utilisez-le juste après le chargement de votre sous-classe UIViewController:

required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)

        //invoke your data source here
    }

Je sais ... je n'aime pas ça non plus mais ...;)

0
Despotovic