Modifica altezza
Quindi, fondamentalmente, ci sono due modi per fare:
Il primo è quello di ricaricare effettivamente la cella (non la vista tabella). Ricaricando chiamerà nuova heightForRow (non dimenticate di eliminare la cache, se si sta Caching le dimensioni), che restituirà una corretta nuova altezza:
let indexPaths = [NSIndexPath(forRow: ~the rows in question~, inSection: 0)]
self.table.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
(Si noti, tuttavia, che questo comporta spesso ricaricare più di una riga; in particolare se si seleziona/deseleziona, è necessario ricaricare tutte le righe modificate)
Se tuttavia si desidera modificare SOLO la dimensione della cella e il contenuto in sé e non modificare realmente il contenuto dei dati ... quindi per esempio:
hai fatto clic su un pulsante e il tuo culo igned nuovo testo locale nella cella alle prese (forse un testo di aiuto):
hai modificato solo il LAYOUT della cella.per esempio, è fatto un carattere più grande, o modificato il margine di un blocco di testo in modo che l'altezza di un blocco di testo modificato, così effettivamente l'altezza della cella complessiva cambiato:
In questo caso invece di ricarico, basta chiamare il seguente, che costringe il Tableview fondamentalmente fare tutte le animazioni, e per questo ha bisogno di nuove altezze, in modo che lo richieda:
self.table.beginUpdates()
self.table.endUpdates()
la vera soluzione
vedo cosa il tuo problema è Stai provando a cambiare l'altezza della cella dalla cella attuale, ma non ci riuscirai -> e non dovresti. Vedi, la cella è vista e la vista non dovrebbe avere alcuna idea dei suoi dati - la vista è ciò che presenta. Se hai bisogno di modifiche, dovresti informare il tuo controllore di farlo. Per fare ciò, è possibile utilizzare le notifiche, ma preferibilmente i protocolli/delegati.
Così in un primo momento si crea il protocollo in cella, che verrà utilizzato per informare il controllore, che c'è un cambiamento:
protocol MyCellDelegate {
func buttonTappedForCell(cell : UITableViewCell)
}
Ora, è necessario conformarsi a tale protocollo nel vostro controller della vista che contiene tavolo:
class MyClassWithTableView : MyCellDelegate
Infine, è necessario dichiarare delegato nella cella:
class MyCell {
var delegate : MyCellDelegate
}
e assegnarlo nella configurazione della cella, che probabilmente avete in controller della vista:
cell.delegate = self
Questa è la configurazione di base per tutti i delegati/protocolli davvero, e ora, quando si fa clic sul pulsante, è possibile inoltrare l'azione per il controller:
@IBAction myButtonTouchUpInside() {
self.delegate.buttonTappedForCell(self)
}
Dopo aver fatto tutto questo, procedere come in parte 1. Vale a dire, sia reloadRowsAtIndexPaths
o un beginUpdates
/endUpdates
coppia come spiegato in precedenza.
Spero che aiuti!
emm, immagino che in qualche modo si debba attivare l'autolayout quando si assegna un nuovo testo all'etichetta e la magia interna si riposa. O c'è qualcosa di non così semplice? – sage444
Ho aggiunto una spiegazione per cui non dovresti - mai - cambiare il contenuto dalla cella, e ho aggiunto anche la soluzione su come farlo. –