2016-06-21 26 views
5

nella mia app che uso UITableView con personalizzato cellule.Come prevenire UITableView dalle cellule riutilizzo personalizzati Swift

per ogni cella implementare la funzione per crearla e chiamare queste funzioni in cellForRow.

questo è un esempio di codice dal progetto:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 


    if indexPath.row == CellsTypes.profileImageCell.rawValue { 

     return createIntroCell() 
    } 

    else if indexPath.row == CellsTypes.fullNameCell.rawValue { 

     return createUserNameCell() 

    } 

    else if indexPath.row == CellsTypes.emailCell.rawValue { 

     return createEmailCell() 


    } 
    else { 

     return createPasswordCell() 

    }} 

e queste sono le funzioni di creazione:

func createUserNameCell() -> TextFieldTableViewCell { 

    let fullNameCell = self.tableView.dequeueReusableCellWithIdentifier("text-field-cell") as! TextFieldTableViewCell 
    fullNameCell.awamirTextFieldNib.setNormalTextFieldCellContent("Full Name") 
    fullNameCell.awamirTextFieldNib.textFieldContent.tag = CellsTypes.fullNameCell.rawValue 
    fullNameCell.awamirTextFieldNib.textFieldContent.returnKeyType = .Next 
    fullNameCell.awamirTextFieldNib.textFieldContent.delegate = self 
    return fullNameCell 
} 

func createEmailCell() -> TextFieldTableViewCell { 

    let emailCell = self.tableView.dequeueReusableCellWithIdentifier("text-field-cell") as! TextFieldTableViewCell 
    emailCell.awamirTextFieldNib.setNormalTextFieldCellContent("Email") 
    emailCell.awamirTextFieldNib.textFieldContent.tag = CellsTypes.emailCell.rawValue 
    emailCell.awamirTextFieldNib.textFieldContent.returnKeyType = .Next 
    emailCell.awamirTextFieldNib.textFieldContent.delegate = self 
    return emailCell 
} 
func createPasswordCell() -> TextFieldTableViewCell { 

    let textFieldCell = self.tableView.dequeueReusableCellWithIdentifier("text-field-cell") as! TextFieldTableViewCell 
    textFieldCell.awamirTextFieldNib.setPasswordCellContent("Password") 
    textFieldCell.awamirTextFieldNib.textFieldContent.tag = CellsTypes.passwordCell.rawValue 
    textFieldCell.awamirTextFieldNib.textFieldContent.returnKeyType = .Next 
    textFieldCell.awamirTextFieldNib.textFieldContent.delegate = self 

    return textFieldCell 
} 

il problema è se ricarico tableView il contenuto delle celle cambiato a causa della reusablity delle cellule. vale a dire: dopo aver ricaricato la vista tabella il contenuto della prima cella diventa nella seconda cella e il contenuto della sencond diventa nella prima cella !!

Come impedire a tableview di riutilizzare le celle ?!

Grazie.

+1

Non dovresti impedire questo, dovresti essere felice che 'UITableView' abbia questa abilità =) –

+0

non devi impedire il riutilizzo delle celle ...invece dovresti imparare a riutilizzare le tue celle altrimenti farai un sacco di elaborazioni inutili e renderai la tua batteria inefficiente – Fonix

+0

il tuo codice mi sembra un po 'disordinato, tu riutilizzi le celle, ma non è ovvio come stai _reset_ contenuto prima di impostarlo come _normal_, _pawwsord_, ecc ... – holex

risposta

6

Provare a usare un identificatore diverso per ognuno dei tipi di cellule, in modo da non utilizzare "text-field-cell" per ciascuno di essi, fare un "nome e cognome", "password", ecc, non sicuro di come si sono in corso sulla creazione di cellule, ma se si utilizza il registerNib o registerClass, è necessario registrarla per ogni diverso identificatore

self.tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "full name") 
self.tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "password") 
self.tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "email") 
+0

, sembra che le tue celle siano state semplicemente aggiustate nelle loro posizioni, potresti semplicemente usare una tableview statica dallo storyboard e non avresti dovuto implementare tutte queste cose ma forse non – Fonix

+0

ehi, grazie :) per favore controlli il mio commento nella risposta precedente? è anche la sua risposta :) – Rawan

+0

non dovresti impostare l'identificatore su zero, controlla la mia risposta aggiornata su cosa intendo dire – Fonix

0

Non utilizzare l'UITableView predefinito e combattere il riutilizzo delle celle, è davvero incorporato nel suo comportamento.

cercare di adattare il codice in modo che funziona bene con le cellule riutilizzo, o se questo è davvero impossibile, che avrebbe dovuto scrivere il proprio punto di vista tabella personalizzata Credo (ma non raccomandare che a tutti)

4

Provare ad implementare il metodo prepareForReuse nella cella personalizzata e impostare il testo di tutti i campi su zero.

override func prepareForReuse() -> Void { 
    awamirTextFieldNib.text = nil 
} 

Spero che questo aiuto

+0

grazie, ma in questo modo perdo il testo dell'UItextfield che l'utente ha inserito prima di ricaricare la tabellaView :( – Rawan

+0

Puoi archiviare questo testo in nsarray e riprenderlo dalla tua nota di indice IndexPath – iSashok

1

non si dovrebbe evitare, ma se si vuole veramente, penso che non impostando l'identificativo della cella sul tuo shox UITableViewCell fare il trucco Quando chiami dequeueReusableCellWithIdentifier, non troverà alcuna cella e ne creerà una nuova. Ma ancora una volta, non è raccomandato come UITableView è fatto per essere utilizzato con capacità di riutilizzo.

Inoltre, come suggerisce @Fonix, l'utilizzo di un identificatore di cella diverso per ogni cella del vostro UITableView potrebbe risolvere il problema mantenendo l'utilizzo del sistema di riutilizzo delle celle.

Edit: Come si sta parlando di perdere il contenuto del testo nel vostro UITextField, forse l'unico cambiamento da fare è cambiare la vostra @propery weak attributo strong.

Spero che questo aiuti.

+0

Grazie mille. ma come far funzionare la tua risposta? puoi spiegare di più per favore? Rimuovere l'identificativo dallo xib. ma quando si registra il pennino, si deve passare un identificativo: S e cnt lo impostano come nullo, e anche nello sviluppo della cella lo stesso problema. – Rawan

+0

È possibile passare un identificatore al momento della registrazione del pennino, diciamo "abc" e utilizzarne un altro durante il riutilizzo, come "cba". Ma perderete l'efficienza ... – AnthoPak