2013-08-20 4 views
23

Recentemente ho provato a lavorare con MainStoryboard.storyboard in Xcode e finora sta andando piuttosto bene e mi chiedo perché non l'ho mai usato prima. Mentre giocavo con un codice ho incontrato un ostacolo e non so come risolvere questo problema.Storyboard e personalizzazione init

Quando ho alloc e init un nuovo ViewController (con un init personalizzato ho dichiarato nella classe ViewControllers) vorrei fare qualcosa di simile:

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

Poi, dopo che avrei potuto fare qualcosa di simile:

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

Quando lavoro con uno storyboard, ho imparato che passare a un ViewController standalone richiede un identificatore.

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

Come posso ancora utilizzare l'inizializzazione personalizzata per myViewController mentre si utilizza uno storyboard?

è ok per fare proprio qualcosa di simile:

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; 
} 

risposta

17

vorrei solo creare un metodo che fa il caricamento dei dati personalizzato.

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

Se tutto il metodo di initWithCustomData non è impostata una variabile di istanza, si deve solo impostare manualmente (non personalizzati INIT o metodi aggiuntivi necessari):

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

Grazie. Sembra strano che Apple non fornisca un modo per creare un metodo 'init' personalizzato con gli Storyboard. – jowie

+2

Non sono sicuro del perché uno dovrebbe dichiarare: "Se tutto il tuo metodo initWithCustomData fa impostare una variabile di istanza, dovresti semplicemente impostarla manualmente (non sono richiesti personalizzazioni o metodi aggiuntivi)". Non ci sono documenti di Apple che affermano che quindi consiglierei a qualsiasi lettore di considerare questa affermazione come una semplice opinione e non come una regola da seguire. Un sacco di inizializzatori in iOS prendono anche solo un argomento. – zumzum

+0

@zumzum Apple usa la pratica di impostare le variabili nel metodo 'prepareForSegue: sender:' nel loro codice di esempio. Vedere il file "AddTimedReminder.m" in [EKReminderSuite] (https://developer.apple.com/library/prerelease/ios/samplecode/EKReminderSuite/Introduction/Intro.html#//apple_ref/doc/uid/TP40015203- Intro-DontLinkElementID_2) esempio di progetto per un esempio. –

16

è possibile creare un'istanza viewcontroller nel metodo -init .

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

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

    if(self) 
    { 
    //default initialization 

    } 
    return self; 
} 

e nel metodo init personalizzato

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

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

    return self; 
} 
+1

Non penso che tu possa farlo in Swift ... –

+0

Sì, potrebbe funzionare per ObjC, ma non in Swift. – Pranshu

2

La mia versione:

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

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

    if(self) 
    { 
    //default initialization 

    } 
    return self; 
} 

... uno di inizializzazione;)