2010-04-27 27 views
9

Ci scusiamo per la domanda di base, ma questo mi turba da un po 'di tempo.UILabel non si aggiorna

ho creare una vista dei dettagli da un datto e cercare di impostare dinamicamente le sue etichette, ma non vengono aggiornati:

- (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]; 
} 

le connessioni in Interface Builder sono impostati. La scheda Connessioni per il proprietario del file mostra

'myLabel' - 'Label (myLabel)' 

qualche idea del perché il valore non sta arrivando?

Un paio di osservazioni:

  • Ho anche un IBAction collegati. Questo metodo viene chiamato correttamente quando I fa clic sul pulsante connesso.
  • Ho alcuni suggerimenti per la mia istruzione NSLog , se questo dovrebbe non utilizzare tmpVC.myLabel.text, ma restituisce anche NULL.
  • myLabel è dichiarato come IBOutlet UILabel * myLabel nell'interfaccia. La proprietà è definita come non anatomica, retain.

Ecco la Luce:

Dopo aver giocato intorno con esso per un po 'di più ho spostato la dichiarazione pushViewController sopra gli aggiornamenti delle etichette. Questo ha risolto gli aggiornamenti delle etichette.

codice di lavoro è simile al seguente:

- (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]; 
} 

Ma io non capisco perché ho bisogno di spingere il mio viewController prima ???

+0

si fa a rilasciare ovunque nel codice diverso da quello dealloc? – Codezy

risposta

14

Ecco perché la vista del controller viene creata pigramente solo quando vi si accede. Spingendo il controller si accede alla vista.

In alternativa, se si aggiunge una linea per accedere alla proprietà vista, funzionerà anche:

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

grazie Yar, ha perfettamente senso! Confusione sparita – iFloh

+0

Pensavo già di essere diventato muto dappertutto. –

+0

grazie @ Hwee-Boon-Yar BTW, tmpVC.view ha restituito un avviso, [vista tmpVC] funziona al 100% per me;) – DeZigny

2

Se tmpVC.myLabel è NULL, probabilmente indica che non è stata effettuata la connessione necessaria in Interface Builder da UILabel alla variabile di istanza myLabel.

+0

La connessione esiste: le prese del proprietario del file mostrano "la mia etichetta" - "Etichetta (myLabel)". – iFloh

1

Non è perché il tuo NSLog sta tentando di stampare l'oggetto etichetta vero e proprio. Se non avete

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

in risposta alle informazioni aggiunte: Il tuo altra questione sembrerebbe essere che si è collegato un NSString all'etichetta. Devi collegarlo a un UILabel. Quindi, nel caso in cui dichiari il tuo myLabel var, cambialo in UILabel *myLabel e lo stesso per qualsiasi proprietà corrispondente.

+0

hmm, penso che tu sia proprio lì, ma (a) quando provo ad aggiungere il ".text" ottengo un errore del compilatore "membro 'myLabel' non in struttura o unione"
(b) il precedente setText la dichiarazione non produce alcun aggiornamento nella vista.
Forse (a) porta alla vista non correttamente collegata al pennino o al controller, ma non può vedere dove potrebbe esserci la pausa .... – iFloh

+0

aggiunto altro alla mia risposta, vedere sopra – Codezy

+0

Ciao Codezy, mi dispiace, che era un refuso (corretto sopra). IB non mi permetteva di collegare il 2 con una classe corrispondente. La definizione è UILabel ... – iFloh

1

Haiil tuo myLabel proprietà in myViewController.m? Si dovrebbe essere in grado di fare qualcosa di simile:

tmpVC.myLabel.text = tmpObj.myTitle;

+0

Questo era nel mio caso. Hai dimenticato "@synthesize". Grazie! – Bill

1

Non sono sicuro, ma credo che questo è quello che sta succedendo:

Quando la vista viene premuto, il controllore carichi la vista dal pennino e aggancia le azioni e gli sbocchi. Prima di questo, le uscite non sono collegate, quindi tmpVC.myLabel è nullo.

Se si vuole essere sicuri, è possibile inserire un punto di interruzione in viewDidLoad di tmpVC per vedere quando viene caricata la vista.