2009-05-23 8 views
1

Je suis le chargement d'une pointe comme:Pourquoi UILabel 0x0?

ContentViewController *theController = [[ContentViewController alloc] initWithNibName:@"ContentView" bundle:nil]; 

qui a une étiquette. Le contrôleur de vue a une IBOutlet de UILabel avec une propriété @ de conservation et de variable synthétisée. Quand je charge la pointe comme ci-dessus d'une autre classe et de référence en tant que propriété de texte de l'étiquette:

theController.myLabel.text = @"testing..."; 

MyLabel a l'adresse de 0x0. Avant l'affectation, le texte est "invalide". Après l'affectation, son type est ContentViewController. Il y a un problème avec la gestion de la mémoire. Des idées?

+0

Dans quelle méthode de ContentViewController appelez-vous theController.myLabel.text = @ "testing ..."; ? –

+0

Je ne l'appelle pas dans ContentViewController. Il est en train de faire dans la classe principale viewcontroller de l'application. Ceci est une application basée sur la vue. – 4thSpace

+0

J'ai créé une nouvelle application basée sur la vue, ajouté un autre xib avec contrôleur et j'ai le même problème. – 4thSpace

Répondre

0

Les ViewControllers ne chargent leurs vues que sur demande. L'appel implicite getMyLabel dans l'affectation provoque le chargement de la vue et la connexion à la connexion. Quant à l'erreur de type, je ne sais pas pourquoi myLabel finirait avec un type de ContentViewController. Vous devriez vérifier les connexions dans le constructeur de l'interface et assurez-vous qu'elles sont connectées correctement.

+0

Les prises sont correctement connectées. Après l'affectation ci-dessus, myLabel est toujours 0x0. – 4thSpace

3

Les connexions ne sont pas faites immédiatement dans l'appel init. La vue principale n'est pas chargée tant que la propriété view du contrôleur de vue n'a pas été accédée, ce qui entraîne la définition de tous vos autres IBOutlets. Si vous essayez d'accéder à un IBOutlet avant le chargement de la vue, ce sera nul. Généralement, le code d'assignation devrait aller dans -viewDidLoad. Si vous avez besoin de faire quelque chose avant d'ajouter la vue à l'écran, juste accéder à la vue avant d'affecter quoi que ce soit à l'un des IBOutlets:

theController.view; 
theController.myLabel.text = @"testing..."; 
0

Est-u écrire du code dans,

-(void)loadView { } 
méthode

?

Si tel est le cas, l'objet IBOutlet n'est pas alloué.
Essayez de commenter cette fonction.
Et si vous avez besoin de cette fonction, appelez loadNibnamed: méthode pour appeler viewController.