2017-07-25 3 views
-1

So habe ich eine Tabellenansicht, die eine Liste von Elementen in jeder Zelle enthält. Jede dieser Zellen enthält eine Bildansicht, die, nachdem sie angetippt wurde, die Zelle erweitert und das Bild für diesen Gegenstand anzeigt. Wenn ich in der Tabellenansicht nach unten scrolle und zurück zu der ausgewählten Zelle blättere, ist das Bild verschwunden. Ich weiß, dass dies auf die Wiederverwendung von Zellen zurückzuführen ist, aber ich bin mir nicht sicher, wie ich das Bild der erweiterten Zellen beim Scrollen durch andere Objekte an Ort und Stelle halten kann.Verhindern, dass die ausgewählte Zelle wiederverwendet wird

Der nächstgelegene ich gekommen bin ist hier: my table view reuse the selected cells when scroll -- in SWIFT

Wenn jemand mir eine Hand geben könnte, die wäre genial. Vielen Dank!

Bearbeiten: Code-Snippets hinzufügen - Sorry für die Wartezeit.

fileprivate var expandedRowIndex: Int? 

// cellForRowAt 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    // CatalogItem row. 
    let item = self.items[indexPath.row] 
    let expanded = indexPath.row == self.expandedItemRowIndex 

    // Return standard catalog item cell. 
    let reuseID = expanded 
       ? CatalogItemCell.PROTOCELL_EXPANDED.id 
       : CatalogItemCell.PROTOCELL.id 
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseID) as! CatalogItemCell 

    // Reset thumbnail image back to nil. Needed so that images appear 
    // only in the cell that they belong in. 
    if indexPath.row == self.expandedRowIndex{ 
     cell.uiImage_Thumbnail.image = nil 
    }  
    return cell 
} 

// didSelectRowAt 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{ 
    tableView.deselectRow(at: indexPath as IndexPath, animated: true) 

    // Expand row - Get the current cell and show image 
    self.expandedItemRowIndex = indexPath.row 
    let item = self.items[indexPath.row] 
    let currentCell = tableView.cellForRow(at: indexPath) 

    // Pass both the selected cell and item to the ImageManager 
    ImageManager.startImageRequest(currentCell: currentCell!, item: item) 

    if self.expandedRowIndex == indexPath.row 
    { 
     // Selected row is already expanded. 
     return 
    } 

    var reloadPaths = [IndexPath]() 

    // Collapse previously expanded row. 
    if let previousRowIndex = self.expandedRowIndex 
    { 
     reloadPaths.append(IndexPath(row: previousRowIndex, section: 0)) 
    } 

    // Expand the selected row. 
    self.expandedRowIndex = indexPath.row 
    let item = self.items[indexPath.row] 
    debugPrint(item.description) 
    reloadPaths.append(IndexPath(row: indexPath.row, section: 0)) 
    tableView.reloadRows(at: reloadPaths as [IndexPath], with: .fade) 

} 
+0

Können Sie den Code für Ihre cellForRowAtIndexPath-Methode hinzufügen? – Delimiter

+1

"Verhindern, dass die ausgewählte Zelle wiederverwendet wird": Nein, Sie möchten die Wiederverwendung und die damit verbundene Optimierung beibehalten. Sie müssen verstehen, wie die Wiederverwendung funktioniert, und Ihren Code daran anpassen. Mit etwas Code und Beispiel können wir Ihnen helfen, aber sonst können wir nicht. – Larme

+0

Meine Frage mit ein paar Schnipsel aktualisiert. Hoffentlich ist es genug, um mich auf die richtige Spur zu setzen. @Larme Ja, ich denke, ich habe die Frage aufgrund meines Mangels an Kenntnissen in der iOS-Welt falsch formuliert. Ich möchte die Zelle erweitert halten und das Bild angezeigt halten, obwohl ich von dieser Zelle weg scrollte. – Mystified

Antwort

3

Sie können eine selectedIndex-Variable pflegen. In Ihrem cellForRow überprüfen Sie, ob dieser Anruf für selectedCell ist. Wenn ja, führen Sie die Anpassung durch, die für die ausgewählte Zelle erforderlich ist.

Auch Sie möchten vielleicht heightForRow behandeln, dort auch überprüfen, ob der Anruf für ausgewählte Zelle ist.

Sie können einen IndexPfad für ausgewählte Zelle verwalten. Wenn es mehrere Abschnitte gibt. Es muss nicht verhindert werden, dass es wiederverwendet wird.

Hoffe, dass hilft.

+0

Es gab eine Variable wie diese in dem Code, von dem ich arbeitete. Wie auch immer, ich bemerkte endlich, dass es nirgendwohin gesetzt wurde. Sobald ich es eingestellt habe, hat alles funktioniert ... Doh! Danke! – Mystified

Verwandte Themen