Non riesco a capire come funziona. Ho letto molti thread su SO su di esso - come ad esempio UITableView dequeueReusableCellWithIdentifier Theory e How does dequeueReusableCellWithIdentifier: work?.Informazioni su UITableView dequeueReusableCellWithIdentifier - restituisce la cella anche alla prima chiamata
Tuttavia, il mio UITableView riattacca ogni volta una cella ogni volta (non è mai nulla), anche quando viene caricata per la prima volta. Avevo l'impressione che celle simili dovessero usare lo stesso identificatore, quindi devi solo cambiare ciò che è necessario.
Perché
if (!cell) {
NSLog(@"New cell");
cell = [[UITableViewCell alloc] initWithStyle:someStyle reuseIdentifier:someIdentifier];
}
non viene mai chiamato, io non sono sicuro di come dovrei gestire celle della stessa tabella con stili diversi, perché lo stile può essere impostato solo nel inizializzatore.
Ho anche provato a utilizzare identificativi di cella diversi, per assicurarmi che non riutilizzasse le celle da una tabella diversa o qualcosa del genere. Sto registrando questi identificatori con [tableView registerClass: forCellReuseIdentifier:]
Se ho capito, questo metodo dovrebbe restituire solo le celle create in precedenza che sono state spostate dallo schermo (nascosto, cioè può essere riutilizzato). Allora come mai restituisce una cella la prima volta che viene chiamata?
Edit: Così la confusione stava usando [tableView dequeueReusableCellWithIdentifier: forIndexPath:]
invece di [tableView dequeueReusableCellWithIdentifier:]
(il primo richiede la registrazione l'identificatore, il secondo tornerà a zero se nessuno è disponibile - il comportamento mi aspettavo sopra).
Tuttavia, ho notato che quando ho cambiato il mio codice per utilizzare [tableView dequeueReusableCellWithIdentifier:]
, crea una nuova cella e la sua contentView.frame
ha una larghezza di 320 (larghezza intera). Prima, quando facevo il dequeue...forIndexPath
darebbe una larghezza di 302, o la larghezza visuale/"reale" della cella. Perchè è questo?
Inoltre, c'è un modo per specificare lo stile di UITableViewCells regstiered per il riutilizzo?
Soluzione: Così ho trovato questa discussione UITableView cell.contentView.bounds.size.width Changes With Cell Reuse, che dice quando si imposta l'autoresizingmask per UIViewAutoresizingFlexibleLeftMargin, che è fisso quando si tenta di fare il posizionamento relativo (la larghezza contentView è inizialmente la piena larghezza, ma quando presentarlo è ridotto, quindi se fai i tuoi calcoli, verrà comunque visualizzato correttamente).
Stavo posizionando un UISwitch sulla destra - e quando ho impostato la maschera di autoresizzazione funziona quando è visualizzata per la prima volta, ma spostato su altri ~ 20 pixel quando l'ho acceso. Non so cosa abbia causato quel cambiamento in più, ma ho finito per risolverlo semplicemente impostando l'UISwitch come accessorio della cellaView.
(Questo è parzialmente fuori tema dalla domanda originale, ma se qualcuno dovesse inciampare su questo forse sarebbe utile). Per chiunque si interroghi in modo specifico sulla domanda originale, la risposta è sotto la prima modifica.
Le celle sono state create in un UITableViewController da uno storyboard? – danypata
Tutti creati a livello di codice ... sì, molte persone dicono di usare lo storyboard ...ma non mi sono abituato e sento che lo capirò meglio sapendo cosa capisco in realtà – Raekye
Nessun problema, ma mi chiedevo perché quando stai creando le celle in un UITableViewContoller da uno storyboard 'il metodo restituirà sempre una cella valida (se viene utilizzato l'identificatore corretto) – danypata