2013-05-03 9 views
17

Ho disposto una vista in un file NIB, quindi ho aggiunto la sottoclasse UIView come proprietario del file.Caricamento di una vista da NIB, IBOutletCollection è nullo anche se altri IBOutlet funzionano correttamente

La sottoclasse si presenta così:

@property (nonatomic, weak) IBOutlet UILabel *categoryLabel; 
@property (nonatomic, weak) IBOutletCollection(UIImageView) NSArray *images; 

Le proprietà sono deboli a causa di questo: https://stackoverflow.com/a/7729141/1016515

Poi ho cablato l'etichetta e le UIImageViews nel pennino, dalla vista al proprietario del file .

Poi, nella parte awakeFromNib della sottoclasse, ho fatto questo:

[[NSBundle mainBundle] loadNibNamed:@"CategoryButton" owner:self options:nil]; 
NSLog(@"label: %@",self.categoryLabel); 
NSLog(@"images: %@",self.images); 

mi aspettavo di vedere gli indirizzi del categoryLabel e le immagini. Invece ho trovato che l'etichetta della categoria andava bene e le immagini sono nil.

Questo è piuttosto sconcertante, perché le dichiarazioni per images e categoryLabel sono identiche. Perché uno lavora e l'altro fallisce?

risposta

75

Lo sto mettendo perché non ho trovato la domanda da nessuna parte, ma sembra un errore piuttosto facile da fare se sei abituato a lavorare con IBOutlet ma non con IBOutletCollections.

Ho creato le proprietà weak perché è quello che faccio di solito per IBOutlet per i motivi discussi in un'altra domanda.

Quello che ho dimenticato di realizzare è che IBOutletCollection è una variabile di istanza della classe, non solo un riferimento arbitrario nella gerarchia della vista. Pertanto, se si tratta di una proprietà debole, lo NSArray * verrà rilasciato immediatamente perché la gerarchia della vista non la mantiene come per altre proprietà di IBOutlet.

La soluzione è semplice, rendere la proprietà strong:

@property (nonatomic, strong) IBOutletCollection(UIImageView) NSArray *images; 

Aggiornamento: Secondo this answer, quasi tutti IBOutlets deve essere forte, a meno che non devono essere deboli per evitare un ciclo di trattenere. Questo è nuovo, e la maggior parte della documentazione dice che gli outlet dovrebbero essere deboli.

+0

Lavori. Facile da perdere questo. Pensato allo stesso modo yo idid! –

+0

Perso anche perché essendo debole, si annulla automaticamente e non si blocca con un forin (foreach, qualunque sia) – txulu

Problemi correlati