Vai al contenuto

Problema di caricamento oggetti legati a file XIB


Messaggi raccomandati

Ciao a tutti!

Ho un problema che non riesco a risolvere, e vorrei chiedervi aiuto se vi è possibile:

Allora, ho creato una classe che estende UIViewController, e insieme ad essa ho associato un file XIB su cui poter lavorare con Interface Builder! Fin qui nessun problema.

All'interno dello stesso file XIB, ho aggiunto un nuovo UIViewController che associo ad un'altra classe che si trova in un file differente, e anche questa estende UIViewController.

MyController1.h è il file che definisce la prima classe associata al file XIB MyController1.xib.

MyController2.h è il nuovo file che definisce la seconda classe associata sempre allo stesso file XIB MyController1.h ma ovviamente ad un UIViewController (che chiaramente andrò poi a richiamare con MyController2 che in realtà estende il UIViewController).

In MyController1.h definisco l'oggetto:

IBOutlet MyController2 *myController2;

E di conseguenza in Interface Builder imposto l'aggancio.

Se da MyController1 provo a far visualizzare myController2 (chessò, attraverso un navigationController cambio vista), riesco correttamente a visualizzare la view di myController2.

Se però provo a far visualizzare myController2 da una classe diversa che non ha nulla a che fare con lo XIB, ho un serio problema.

Classe esterna allo XIB che prova a richiamare myController2:


   MyController1 *myController1 = [[MyController1 alloc] initWithNibName:@"MyController1" bundle:nil];

   MyController2 *myController2 = myController1.myController2;

   [navigationController pushViewController:myController2 animated:YES];

Il navigation controller non riesce a farmi visualizzare myController2 dato che questo oggetto è uguale a "nil"!

C'è qualcuno che potrebbe aiutarmi?? :)

Link al commento
Condividi su altri siti

  • 2 settimane dopo...

guarda, non ho le migliori competenze purtroppo per questo argomento ma a naso...

non devi associare uno xib anche alla seconda classe (quella con problemi) ?

ovvero, o tieni tutto nel main xib (allora va sempre) oppure se dividi associ ad ogni classe.

Sospetto sia così, io di fatto, non avendo mai avuto applicazioni esageratamente complesse da un punto di vista di finestre ho addirittura sempre usato un unico xib.

Link al commento
Condividi su altri siti

Ciao,

innannzitutto una domanda.

Dici di aver definito la variabile come:

IBOutlet MyController2 *myController2;

ma poi lo chiami scrivendo:

MyController2 *myController2 = myController1.myController2;

Sicuro di non averlo definito come proprietà, invece?

@property(nonatomic, weak) IBOutlet MyController2 *myController2;

Poi...

Normalmente inizializzare una classe (NSObject così come UIViewController) vuol dire istanziare (creare) anche le sue variabili.

Fai attenzione, però, perchè la variabile d'istanza della tua classe non è un oggetto, ma un puntatore! (è normale)

MyController2 *myController2;		  //puntatore

Fin quando non vengono singolarmente inizializzate (nel metodo "init"), le variabili di istanza di una classe puntano ai loro valori di defaul: nil per gli oggetti, 0 per gli int, NO per i BOOL, ecc. Questo è per evitare errori nel caso in cui uno le definisca e poi provi a usarle prima che gli venga assegnato un valore. (questo non vale per i metodi, dove se le definisci e le usi senza prima avergli dato un valore ottieni un errore)

Nel caso dei file di interfaccia serializzati nei file NIB, questa assegnazione di valori avviene quando deserializzi il NIB, e questo normalmente succede all'interno del metodo -initWithNibName:bundle: .

Sembrerebbe che nel tuo caso questo non avvenga. (stai chiamando [super initWith....]?)

Forse c'è qualcoasa che manca lì, forse non mostrandolo a schermo non viene chiamato -viewDidLoad e avevi messo della logica cruciale lì dentro.

Ti consiglio di inserire degli NSLog(); nel flusso di inizalizzazione, provare a crearlo sia normalmente (quando ti funziona) che con il secondo sistema (quando ti appare come nil), e paragonare gli output a console per vedere dove il processo di interrompe nel secondo caso.

iMac 27" (11,3 Mid 2010) - Intel Core i5 quad-core 2,8 GHz - SDRAM 4GB DDR3 - ATI Radeon HD 5750 1024MB - HDD 1TB 7200rps

MacBook (4,1 Early 2008) - Intel Core 2 Duo 2,4 GHz - SDRAM 4GB DDR2 - Intel GMA X3100 144MB - HDD 320GB 7200rps

iPhone 3G 8GB - iPod nano (1st generation - 2005) 2 GB

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...