2010-04-27 8 views
9

Sorry die Grundfrage, aber das nervt mich schon eine Weile.UILabel nicht updaten

ich ein Detail aus einem uitable sehen und versuchen, dynamisch ihre Etiketten zu setzen, aber sie werden nicht aktualisiert:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    myObject *tmpObj = [[myObject objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 

    myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil]; 

    [tmpVC.myLabel setText:tmpObj.myTitle]; // The debugger shows the text: myTitle = "myText" 
    NSLog(@"%@", tmpVC.myLabel);    // NSLog SHOWS NULL 

    [self.navigationController pushViewController:tmpVC animated:YES]; 
    [tmpObj release]; 
} 

die Verbindungen im Interface Builder festgelegt werden. Die Registerkarte Verbindungen für Dateibesitzer zeigt

'myLabel' - 'Label (myLabel)' 

irgendwelche Ideen, warum der Wert nicht durchkommt?

Noch ein paar Bemerkungen:

  • Ich habe auch ein IBAction verbunden. Diese Methode wird ordnungsgemäß aufgerufen, wenn ich auf die verbundene Schaltfläche klicke.
  • Ich habe ein paar Hinweise auf meine NSLog-Anweisung, ob das sollte nicht besser tmpVC.myLabel.text verwenden, aber versuchen, gibt auch NULL zurück.
  • myLabel wird als IBOutlet UILabel * myLabel in der Schnittstelle deklariert. Die Eigenschaft ist definiert als nichtatomare, behalten.

ES GIBT DAS LICHT:

Nach dem Spiel, um mit ihm ein bisschen mehr zog ich die Pushviewcontroller Aussage über den Label-Updates. Das löste die Etikettenaktualisierungen.

Arbeits Code sieht wie folgt aus:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
myObject *tmpObj = [[myObject objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 

myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil]; 

[self.navigationController pushViewController:tmpVC animated:YES]; 

[tmpVC.myLabel setText:tmpObj.myTitle]; // The debugger shows the text: myTitle = "myText" 
NSLog(@"%@", tmpVC.myLabel);    // NSLog SHOWS NULL 

[tmpObj release]; 
} 

Aber ich verstehe nicht, warum ich zuerst meine Viewcontroller schieben müssen ???

+0

tun Sie es überall in Ihrem Code freigeben andere als die dealloc? – Codezy

Antwort

14

Das liegt daran, dass die Ansicht des Controllers nur beim Zugriff nur langsam erstellt wird. Durch Drücken des Controllers wird auf die Ansicht zugegriffen.

Alternativ, wenn Sie eine Zeile in der Ansicht Eigenschaft zuzugreifen, wird es auch funktionieren:

myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil]; 
    tmpVC.view; // Force view creation 
    [tmpVC.myLabel setText:tmpObj.myTitle]; // The debugger shows the text: myTitle = "myText" 
    NSLog(@"%@", tmpVC.myLabel);    // NSLog will display "myText" 
    [self.navigationController pushViewController:tmpVC animated:YES]; 
+0

danke Yar, macht Sinn! Verwirrung weg – iFloh

+0

Ich dachte schon, ich wäre überall dumm geworden. –

+0

danke @ Hwee-Boon-Yar BTW, tmpVC.view gab eine Warnung zurück, [tmpVC view] funktioniert 100% für mich;) – DeZigny

2

Wenn tmpVC.myLabel NULL ist, weist dies wahrscheinlich darauf hin, dass Sie nicht die erforderliche Verbindung im Interface Builder von der UILabel zu Ihrer myLabel-Instanzvariablen hergestellt haben.

+0

Die Verbindung besteht: Die Datei Besitzer zeigt "mein Label" - "Label (myLabel)". – iFloh

1

Ist es nicht, weil Ihr NSLog versucht, das tatsächliche Etikettenobjekt auszudrucken. Sollten Sie nicht

NSLog(@"%@", tmpVC.myLabel.text); 

In Reaktion auf die zusätzliche Informationen haben: Ihr anderes Problem scheint zu sein, dass Sie ein NSString zu Ihrem Label verknüpft haben. Sie müssen es mit einem UILabel verknüpfen. Also, wo Sie Ihre var, ändern Sie es zu UILabel *myLabel, und das gleiche für jede passende Eigenschaft.

+0

hmm, ich glaube, du hast recht, aber (a) wenn ich versuche, ".text" hinzuzufügen, bekomme ich einen Compilerfehler "member 'myLabel' nicht in Struktur oder Union"
(b) der vorhergehende setText Die Anweisung erzeugt keine Aktualisierungen in der Ansicht.
Vielleicht (a) führt zu der Ansicht nicht richtig mit der Feder oder Controller verbunden, kann aber nicht sehen, wo die Pause sitzen könnte .... – iFloh

+0

hinzugefügt mehr zu meiner Antwort, siehe oben – Codezy

+0

Hallo Codezy, sorry, dass war ein Tippfehler (oben korrigiert). IB würde mich nicht die 2 w/out eine passende Klasse verbinden lassen. Die Definition ist UILabel ... – iFloh

1

Haben Sie @synthesize Ihre myLabel Eigenschaft in myViewController.m? Sie sollten so etwas wie die Lage zu tun:

tmpVC.myLabel.text = tmpObj.myTitle;

+0

Das war es in meinem Fall. Ich habe "@synthesize" vergessen. Vielen Dank! – Bill

1

nicht sicher, aber ich denke, das ist, was los ist:

Wenn die Ansicht gedrückt wird, der Controller die Ansicht von der Spitze lädt und hakt nach oben die Aktionen und Verkaufsstellen. Davor sind die Ausgänge nicht verbunden, also ist tmpVC.myLabel gleich Null.

Wenn Sie sicher sein wollen, könnten Sie einen Haltepunkt in viewDidLoad von tmpVC setzen, um zu sehen, wenn die Ansicht geladen ist.