2009-05-19 12 views
1

Wenn ich programmatisch eine UILabel in meiner benutzerdefinierten initWithNibName Methode zugeordnet und später in viewDidLoad, versucht, eine Zeichenfolge, um es zuzuweisen, das Etikett nicht auf etwas zeigt wurde. Ich habe es nicht veröffentlicht; Das Etikett wird auf dem Bildschirm angezeigt. Wenn ich das Label in IB erstellen und ihm in viewDidLoad Text zuweisen, funktioniert es.IB Objekte vs manuell zugeordneten Objekte in init/viewDidLoad

Ist es gegen eine Regel manuell zugeordneten Objekte in viewDidLoad einzurichten? Warum zeigt es nicht auf etwas, obwohl ViewDidLoad nach meinem init aufgerufen wird?

Vom doc von viewDidLoad:

Diese Methode wird aufgerufen, nachdem die View-Controller den damit verbundenen Ansichten in den Speicher geladen wurde. Diese Methode wird unabhängig davon aufgerufen, ob die Ansichten in einer NIB-Datei gespeichert oder in der loadView-Methode programmgesteuert erstellt wurden. Diese Methode wird am häufigsten verwendet, um zusätzliche Initialisierungsschritte für Ansichten auszuführen, die aus NIB-Dateien geladen werden.

In meinem 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]; 

In viewDidLoad, ist der Wert der Variablen 0x0. Es ist das gleiche mit meiner manuell zugewiesenen UIButton, die vollständig funktioniert, sobald die Ansicht geladen wird.

+0

Können Sie Beispielcode anzeigen, der nicht funktioniert? Ich weiß nicht, was Sie meinen, "das Etikett zeigte nicht auf irgendwas" – stefanB

+0

Editierter Originalbeitrag zur Klarstellung. – hyn

+0

Haben Sie das UILabel in IB erstellt, z. Ist es als IBOutlet UILable definiert und ist es mit einem UILabel-on-Fenster in IB verbunden oder versuchen Sie es pragmatisch zu erstellen, z. UILable * descLabel = [[...]]? – stefanB

Antwort

1

Wenn Sie die UILabel programmatisch erstellen möchten, können Sie, aber Sie tun es immer noch in viewDidLoad (im Gegensatz zu initWithNibName gegen).

Haben Sie keine Angst, UI-Setup in ViewDidLoad zu tun. Es wird bereitgestellt, um statische UI-Elemente hinzuzufügen, BEVOR die Ansicht auf dem Bildschirm erscheint.

Die Ansicht wird nicht angezeigt, bis kurz vor viewDidAppear: (BOOL) animiert aufgerufen wird.

Wenn Sie dynamische Inhalte in viewWillAppear konfigurieren: (BOOL) animiert. (Dies sieht aus wie Ihre Situation)

Dann stellen Sie sicher, dass es zu der Ansicht hinzufügen:

[self.view addSubview:myLabel]; 

Wenn Sie zukünftig Zugriff auf Ihr neues Label benötigen, müssen Sie ein Ivar erstellen einen Zeiger auf halten es.

+0

Ich habe meinen init-Code in viewDidLoad wie vorgeschlagen verschoben. Ich verstehe immer noch nicht, warum meine initialisierten Objekte auf 0x0 jedoch zeigten. – hyn

+0

Apple sagt, dass ViewDidLoad für zusätzliche Einrichtung verwendet werden sollte. Ich muss die Dokumente erneut lesen, aber das ist wahrscheinlich einer der Gründe dafür. Das Objekt ist wahrscheinlich vor viewDidLoad nicht richtig eingerichtet. Ich weiß, ich habe auch Setup in InitWithCoder beim Initialisieren von einem Nib gemacht, aber ich kann mich nicht erinnern, die Situation speziell zu kommentieren –

0

Im Code geschrieben wird die _descriptionLabel UILabel nicht beibehalten und wird vor der Ansicht gezogen wird freigegeben.

Versuchen

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

Stellen Sie sicher, [_descriptionLabel release] setzen in dealloc. Dies setzt voraus, dass _descriptionLabel eine Instanzvariable ist.

Dies gilt grundsätzlich für jedes Objekt, das Sie mit alloc, copy oder new erstellen.

+1

Es muss nicht beibehalten werden, es ist zugewiesen. – hyn