2009-05-19 7 views
1

Lorsque j'attribuait par programme un UILabel dans ma méthode initWithNibName personnalisée, et plus tard dans viewDidLoad, essayait de lui assigner une chaîne, l'étiquette ne pointait sur rien. Je ne l'ai pas libéré; l'étiquette apparaît sur l'écran. Si je crée l'étiquette dans IB et lui assigne du texte dans viewDidLoad, cela fonctionne.Objets IB vs objets alloués manuellement dans init/viewDidLoad

Est-ce contraire à une règle de configurer des objets alloués manuellement dans viewDidLoad? Pourquoi ne pointe-t-il pas à quelque chose, même si viewDidLoad est appelé après mon init?

De la doc de viewDidLoad:

Cette méthode est appelée après que le contrôleur de vue a chargé ses vues associées en mémoire. Cette méthode est appelée, que les vues aient été stockées dans un fichier nib ou créées par programmation dans la méthode loadView. Cette méthode est généralement utilisée pour effectuer des étapes d'initialisation supplémentaires sur les vues chargées à partir de fichiers nib.

Dans mon INIT:

_descriptionLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 218, 280, 10)]; 
    _descriptionLabel.numberOfLines = 0; 
    _descriptionLabel.lineBreakMode = UILineBreakModeWordWrap; 
    _descriptionLabel.font = [UIFont systemFontOfSize:12.0]; 
    _descriptionLabel.adjustsFontSizeToFitWidth = NO; 
    _descriptionLabel.text = @"Description not found."; 
    _descriptionLabel.backgroundColor = [UIColor clearColor]; 

En viewDidLoad, la valeur de la variable est 0x0. C'est la même chose avec mon UIButton assigné manuellement, qui fonctionne entièrement une fois la vue chargée.

+0

Pourriez-vous montrer un exemple de code qui ne fonctionne pas? Je ne sais pas ce que vous voulez dire par "l'étiquette ne pointait à rien" – stefanB

+0

Edited original post for clarification. – hyn

+0

Avez-vous créé UILabel dans IB, par exemple? est-il défini comme IBOutlet UILable et est-il connecté à une fenêtre UILabel on dans IB, ou essayez-vous de le créer de manière pragmatique, par ex. UILable * descLabel = [[...]]? – stefanB

Répondre

1

Si vous voulez créer UILabel par programmation, vous le pouvez, mais vous le faites toujours dans viewDidLoad (par opposition à initWithNibName). N'ayez pas peur de faire la configuration de l'interface utilisateur dans viewDidLoad. Il est fourni pour ajouter des éléments d'interface utilisateur statique AVANT que la vue n'apparaisse à l'écran.

La vue n'apparaîtra que juste avant l'affichage de viewDidAppear: (BOOL) animated.

Si vous avez du contenu dynamique, configurez-le dans viewWillAppear: (BOOL) animé. (Cela ressemble à votre situation)

alors assurez-vous d'ajouter à la vue:

[self.view addSubview:myLabel]; 

Si vous avez besoin d'un accès futur à votre nouvelle étiquette, vous devez créer un Ivar pour tenir un pointeur vers il.

+0

J'ai déplacé mon code init dans viewDidLoad comme suggéré. Je ne comprends toujours pas pourquoi mes objets initialisés pointaient vers 0x0 .. – hyn

+0

Apple déclare que viewDidLoad devrait être utilisé pour une configuration supplémentaire. Je dois relire les docs, mais c'est probablement l'une des raisons pour lesquelles. L'objet n'est probablement pas configuré correctement avant viewDidLoad. Je sais que j'ai également fait l'installation dans initWithCoder lors de l'initialisation à partir d'un Nib, mais je ne me souviens pas de la situation spécifiquement pour commenter –

0

Dans le code affiché, le UILabel _descriptionLabel n'est pas conservé et sera libéré avant que la vue ne soit dessinée.

Essayez

_descriptionLabel = [[[UILabel alloc] initWithFrame:CGRectMake(20, 218, 280, 10)] retain]; 

Assurez-vous que vous mettez [version _descriptionLabel] dans dealloc. Cela suppose que _descriptionLabel est une variable d'instance.

Cela s'applique fondamentalement à tout objet que vous créez avec alloc, copy ou new.

+1

Il n'a pas besoin d'être conservé, il est alloué. – hyn