2014-10-22 18 views
6

voglio usare la mia classe UITableViewCell, così nel corrispondente UITableViewController scrivoSwift - Utilizzare init-metodo diverso per dequeueReusableCellWithIdentifier

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentitfier, forIndexPath: indexPath) as MyTableViewCell //cellIdentifier is initialized 
    return cell 
} 

che voglio, però, inizializzare il mio cellulare, come devo passare gli argomenti quando è stato creato I documenti Apple dicono che le chiamate dequeueReusableCellWithIdentifier (se una cella deve essere inizializzata) initWithStyle:reuseIdentifier.

Se c'è una cella da riutilizzare, il metodo chiama prepareForReuse.

In entrambi i casi, voglio passare argomenti alla mia cella prima di altri metodi vengono eseguiti (ad esempio, in fase di inizializzazione e in preparazioneForReuse, rispettivamente).

Qual è il modo appropriato per farlo ed esiste un modo per utilizzare altri inizializzatori come definito nella classe che deriva da UITableViewCell (MyTableViewCell)?

+0

Sarebbe utile sapere che tipo di cose è necessario passare al tuo cellulare. Puoi creare il tuo metodo init, ma non conosco un modo per intercettare prepareForReuse (in un modo che ti permetta di passare qualcosa ad esso). Se è necessario personalizzare le celle per il riutilizzo, è consigliabile eseguirlo nel controller della vista tabella utilizzando tableViewWillDisplayCell: forRowAtIndexPath :. – rdelmar

+0

In realtà abbastanza semplice: sto creando TableViews nelle celle, quindi ho bisogno di fornire il numero di sezione in quanto queste informazioni vengono perse. Ho solo pensato che sarebbe una buona pratica fornire le informazioni rilevanti al momento dell'inizializzazione. – Cordt

risposta

0

Se si desidera disporre di un metodo personalizzato init, è necessario (a) assicurarsi che non sia stato definito un prototipo di cella (poiché se lo si fa, chiamerà l'inizializzatore stesso); e (b) il cellForRowAtIndexPath gestisce in modo appropriato quando non è stata trovata una cella riutilizzati e quindi bisogna istanziare solo (con tutto ciò che i parametri desiderati.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as MyTableViewCell? 

    if cell == nil { 
     cell = MyTableViewCell(param1: "foo", param2: "bar", reuseIdentifier: cellIdentifier) 

     // configure new cell here 
    } else { 
     // reconfigure reused cell here 
    } 

    return cell! 
} 

Personalmente, però, non sarei incline ad andare che . percorso preferirei approfittare dei prototipi cellulari e le routine di inizializzazione standard, ma poi basta sostituire le proprietà (o chiamare una qualche funzione di configurazione), se necessario, ad esempio:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyTableViewCell 

    cell.property1 = "Foo" 
    cell.property2 = "Bar" 

    return cell 
} 

in questo modo posso godere prototipo di cella , l'istanziazione automatica della classe oggetto della mia cella, la mappatura di IBOutlet e IBActions, ecc., ma fai cosa configurazione sempre speciale di cui ho bisogno qui in cellForRowAtIndexPath.

+0

Grazie mille, non ora che non dovrei avere una cella prototipo. Per quanto riguarda la parte 'if cell == nil ...': In [questo post] (http://stackoverflow.com/a/16388242/4170176) si afferma che _Se il dequeueReusableCellWithIdentifier: metodo richiede una cella .. .._ Pertanto mi chiedo se la tua prima soluzione sostituisca semplicemente la cella creata e se sia necessario utilizzare storyboard e 'dequeueReusableCellWithIdentifier' o andare interamente programmaticamente con qualche altro meccanismo? – Cordt

+0

Se si utilizza il prototipo, non è possibile intercettare la creazione di istanze (da qui la mia prima risposta, poiché sembravi intenzionato a chiamare i parametri del metodo init proprio per qualche motivo). Preferisco la seconda alternativa, in cui usi il prototipo come normale, lascia che la cella sia istanziata per te e semplicemente la modifica come meglio credi. – Rob

Problemi correlati