2012-02-05 1 views
6

ho avuto una visione unica nel mio storyboard, che aggiungo alla mia vista corrente nel modo seguente:crash quando si crea un'istanza ViewController da Storyboard

MainViewController *mvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainController"]; 
      [self.view addSubview:mvc.view]; 

storyboard

Viene visualizzata la vista, ma tutto quello che ho fare dopo che appare, porta a un incidente. Che cosa sto facendo di sbagliato ?

Ecco un esempio quando si blocca:

-(IBAction)showUsername:(id)sender{ 

    [testLabel setText:@"username"]; 

} 

Tutto è collegato in storyboard e, in modo falsamente connessioni collegate non dovrebbero causare il problema.

+0

si dovrebbe mostrare il vostro crash log qui ... – Seamus

+0

non v'è nulla di più di un blu "(gdb)" ... –

risposta

8

si crea un'istanza di una nuova visione del controller:

MainViewController *mvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainController"]; 

Ma non conservarlo. La tua gerarchia di viste è, non appena l'hai aggiunta a un'altra vista.

[self.view addSubview:mvc.view]; 

Così, quando un pulsante viene premuto, viene inviato un messaggio a voi IBAction, ma il vostro controller della vista è stato rilasciato già. Per evitare che ciò accada, conservare la variabile mvc, ad esempio da qualche parte in una proprietà.

@property(nonatomic, strong) MainViewController *controller; 

self.controller = mvc; 
+0

sì grazie, ho fatto di nuovo questa domanda, e ho ottenuto la stessa risposta ... Il problema è già stato risolto, ma grazie comunque. Sono sicuro che questo aiuterà anche gli altri. –

+0

Ti amo <3 la console di debug non ti dà nemmeno la minima idea per scoprirlo! –

0

enter image description here

mi viene in mente ogni ragione prima di mostrare log ...

+0

Penso che viene rilasciato o no non è correttamente un'istanza ... Ma io non so come risolverlo L'ho assegnato alla mia classe controller, dovrebbe funzionare bene. –

+0

@ user1066899 puoi premere ctrl e trascinare il tuo viewcontroller da ib al tuo file .h. allora va tutto bene. – Seamus

+0

no, sfortunatamente non posso ... Che cosa farebbe? –

0

Accendere NSZombie sul nel prodotto >> Modifica schema si dovrebbe avere più di errore descrittivo mostrando quindi. Quindi puoi aggiungerlo.

+0

Sì, grazie che funziona bene. Ora finalmente ottengo l'errore e, come ho ipotizzato, il mio ViewController viene deallocato '- [MainViewController performSelector: withObject: withObject:]: messaggio inviato all'istanza dealloca 0x3fa5a60' –

+0

Ma non so come risolverlo ... puoi aiutami ? –

0

Assicurarsi che il metodo sia dichiarato e implementato correttamente. Assicurati inoltre di avere IBOutlet UILabel * testLabel nel tuo .h. L'unico altro problema a cui riesco a pensare a parte questo è come l'hai collegato. Crolla solo quando si preme il pulsante?

0

Questa riga è sbagliata, questo è il motivo per cui viene visualizzato l'errore.

MainViewController *mvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainController"]; 
     [self.view addSubview:mvc.view]; 

sostituirlo con questo

MainViewController *mvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainController"]; 
[self presentModalViewController:mvc animated:YES]; 

In storyboard non si aggiunge una visualizzazione secondaria si sta facendo una delle tre cose che presentano un modale, spingendolo al catasta controller di navigazione o fare uno personalizzato di questi.

+0

La vista aggiuntiva è riservata per quando è stato presentato viewcontrolle. – Popeye