2017-08-11 2 views
-2

Ich habe eine UIButton in einer UITableViewCell, wo sich das Bild ändert, sobald die Schaltfläche angetippt wird. Obwohl die ausgewählten Schaltflächen wie beabsichtigt ausgewählt wurden, verschwinden die ausgewählten Bilder nach dem erneuten Bildlauf der UITableView, da die Zellen wiederverwendet werden.UITableViewCell Bilder verschwinden beim Scrollen

Ich habe Probleme beim Schreiben der Logik. Bitte helfen Sie.

Mein Code ist unten, in Swift 3.

CellForRow:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 

    //Button_Action 
    addSongButtonIdentifier(cell: cell, indexPath.row) 
} 

Dies ist, wo die Zelle erstellt wird:

func addSongButtonIdentifier(cell: UITableViewCell, _ index: Int) { 
    let addButton = cell.viewWithTag(TABLE_CELL_TAGS.addButton) as! UIButton 

    //accessibilityIdentifier is used to identify a particular element which takes an input parameter of a string 

    //assigning the indexpath button 
    addButton.accessibilityIdentifier = String (index) 
    // print("visible Index:",index) 
    print("Index when scrolling :",addButton.accessibilityIdentifier!) 

    addButton.setImage(UIImage(named: "correct"), for: UIControlState.selected) 
    addButton.setImage(UIImage(named: "add_btn"), for: UIControlState.normal) 

    addButton.isSelected = false 
    addButton.addTarget(self, action: #selector(AddToPlaylistViewController.tapFunction), for:.touchUpInside) 
} 

Die Tap-Funktion:

func tapFunction(sender: UIButton) { 
    print("IndexOfRow :",sender.accessibilityIdentifier!) 
    // if let seporated by a comma defines, if let inside a if let. So if the first fails it wont come to second if let 


    if let rowIndexString = sender.accessibilityIdentifier, let rowIndex = Int(rowIndexString) { 
    self.sateOfNewSongArray[rowIndex] = !self.sateOfNewSongArray[rowIndex]//toggle the state when tapped multiple times 
    } 
    sender.isSelected = !sender.isSelected //image toggle 
    print(" Array Data: ", self.sateOfNewSongArray) 

    selectedSongList.removeAll() 

    for (index, element) in self.sateOfNewSongArray.enumerated() { 
     if element{ 
      print("true:", index) 

      selectedSongList.append(songDetailsArray[index]) 

      print("selectedSongList :",selectedSongList) 
     } 
    } 
} 
+0

Stellen Sie die gleiche Frage nicht mehrmals. https://stackoverflow.com/questions/45627323/selected-button-of-a-uitablecell-get-disappear-when-scrolling/45629235#45629235 – PGDev

+1

Mögliche Duplikate von [Ausgewählte Schaltfläche einer UITableViewCell verschwinden beim Scrollen] (https : //stackoverflow.com/questions/45627323/selected-button-of-a-uitablecell-get-disappear-when-crolling) – PGDev

Antwort

1

Es gibt logische Fehler in func addSongButtonIdentifier(cell: UITableViewCell, _ index: Int) Funktion in Zeile addButton.isSelected = false

es addButton.isSelected = self.sateOfNewSongArray[index]

Da cellForRowAtIndexPath Methode aufgerufen wird jedes Mal Tabelle wird gescrollt werden soll, ist es Zurücksetzen ausgewählten Zustand von ‚AddButton‘

1

Sie müssen arr ay, wo Sie speichern, welche Indizes ausgewählt sind wie selectedSongList Array, das Sie haben. Dann in Ihrer cellForRow Methode müssen Sie Bool proparty aus diesem Array verwenden, um Zustand zu Ihrer Taste geben oder abgewählt oder in Ihrem addSongButtonIdentifier Methode ausgewählten Zustand benötigt

addButton.isSelected = selectedSongList.contains(indexPath.row) 
0

bester Ansatz sein wird, eine Modellklasse und Haltung verwenden die Spur jedes einzelnen Elements in der Zelle. Aber lassen Sie mich Ihnen eine schnelle Lösung geben.

Erstellen Sie eine benutzerdefinierte Klasse von Button, wo dies so ist.

class classname: UIButton { var imageName: String? }

Go in Ihrem Storyboard die Klasse von UIButton ändern

In Ihrem tableViewCellForIndexPath auf Klassenname

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    let addButton = cell.viewWithTag(TABLE_CELL_TAGS.addButton) as! classname 

    if let imgName = addButton.imageName { 
     addButton.setImage(UIImage(named: imgName), for: UIControlState.normal) 
    } else { 
     addButton.setImage(UIImage(named: "add_btn"), for:UIControlState.normal) 
    } 
    addButton.addTarget(self, action: #selector(AddToPlaylistViewController.tapFunction), for:.touchUpInside) 
return cell 
} 

Lassen Sie uns nun

func tapFunction (Absender zu Ihrer tapbutton Implementierung bewegen: Klassenname) {

print("IndexOfRow :",sender.accessibilityIdentifier!) 
// if let seporated by a comma defines, if let inside a if let. So if the first fails it wont come to second if let 


if let rowIndexString = sender.accessibilityIdentifier, let rowIndex = Int(rowIndexString) { 
self.sateOfNewSongArray[rowIndex] = !self.sateOfNewSongArray[rowIndex]//toggle the state when tapped multiple times 
} 
sender.imageName = sender.imageName == "correct" ? "add_btn" : "correct" //image toggle 
sender.setImage(UIImage(named: sender.imageName), for:UIControlState.normal) 

print(" Array Data: ", self.sateOfNewSongArray) 

selectedSongList.removeAll() 

for (index, element) in self.sateOfNewSongArray.enumerated() { 
    if element{ 
     print("true:", index) 

     selectedSongList.append(songDetailsArray[index]) 

     print("selectedSongList :",selectedSongList) 
    } 
} 


} 
1

Erstellen Sie eine Modellklasse zum Füllen von UITableView, und nehmen Sie in diesem Modell UIImage-Versionen an, in denen das aktuelle Bild für die Zelle enthalten ist. Wenn Sie auf die Schaltfläche klicken, ändern Sie einfach die Variable UIImage mit dem aktuellen Bild.

Verwandte Themen