2017-03-16 1 views
2

Ok, brauche ein wenig Hilfe hier. Ich bin neu in Swift. Hier ist mein Problem.Wiederverwendbare Zelle ruft PrepareForReuse Funktion nicht

Beim Abrufen von Daten für meine UITableView rufe ich Bilddaten von einer URL auf, daher gibt es eine leichte Verzögerung, wenn wiederverwendete Zellen abgerufen werden, was dazu führt, dass die Zelle eine halbe Sekunde alte Daten anzeigt. Ich habe versucht, func prepareForReuse aufzurufen, um Eigenschaften zurückzusetzen, aber es scheint nicht zu funktionieren. Jede Hilfe wird geschätzt!

Hier ist mein Code, wenn die Zelle Aufruf:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    cell.alpha = 0 
    let book = books[indexPath.row] 
    cell.textLabel?.text = book.bookTitle 
    cell.detailTextLabel?.text = book.postURL 
    let url = URL(string: book.postPicture) 
    DispatchQueue.global().async { 
     let data = try? Data(contentsOf: url!) 
     DispatchQueue.main.async { 
      cell.alpha = 0 
      cell.backgroundView = UIImageView(image: UIImage(data: data!)) 
      UIView.animate(withDuration: 0.5, animations: { 
       cell.alpha = 1 
      }) 
     } 
    } 
    cell.contentView.backgroundColor = UIColor.clear 
    cell.textLabel?.backgroundColor = cell.contentView.backgroundColor; 
    cell.detailTextLabel?.backgroundColor = cell.contentView.backgroundColor; 

    func prepareForReuse(){ 
     cell.alpha = 0 
     cell.backgroundView = UIImageView(image: UIImage(named: "book.jpg")) 
    } 
    return cell 


} 
+0

Sie können 'prepareForReuse' auf diese Weise nicht überschreiben. Sie müssen die Klasse 'UITableViewCell' ableiten und sie in der Deklaration der Unterklasse überschreiben. Und Sie müssen das Ergebnis von 'dequeueReusableCell (withIdentifier: for:)' in Ihre Unterklasse eingeben. Außerdem sollten Sie Ihre Bilder technisch zuerst asynchron auf die Festplatte herunterladen und dann von der Festplatte in die Bildansicht laden, während der Benutzer scrollt. –

+0

Ok, hast du ein Beispiel wie das funktionieren würde? – Gerrit

Antwort

5

Sie UITableView Zelle Unterklasse sollte und innerhalb Ihrer benutzerdefinierten Klasse überschreiben:

import UIKit 

class CustomTableViewCell: UITableViewCell { 

    override func prepareForReuse() { 
     // your cleanup code 
    } 
} 

dann in UITableViewDataSource Methode die benutzerdefinierte Zelle wiederzuverwenden:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell: CustomTableViewCell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! CustomTableViewCell 
    return cell 
} 
+0

Es ist in einem UITableViewController, aber ich habe auch den Datenparser in der gleichen Klasse. Könnte das ein Problem verursachen? Wenn ich das override-func außerhalb der tableview -Funktion setze, bekomme ich auch "Methode überschreibt keine Methode aus ihrer Oberklasse" und "Verwendung der nicht aufgelösten Bezeichner 'Zelle'" – Gerrit

+0

Halten Sie an. Ich denke, mein Problem ist, dass ich alles in einem CONTROLLER stopfe und nicht in CELL ... Lass mich das wirklich schnell überprüfen. – Gerrit

+0

@ Garyb99 Genau;] Sie müssen die Methode in der Zelle überschreiben, nicht in der Steuerung. –

Verwandte Themen