Ich habe ein benutzerdefiniertes UITableViewCell, das Videos mit ihren Miniaturbildern anzeigt. Ich füge das Miniaturbild UIImageView programmgesteuert hinzu. Wenn ich jedoch mehr als eine Zeile in meinem UITableView habe, wird das UIImageView der Zellen in jeder anderen Zelle angezeigt. Wenn ich beispielsweise 2 Zellen habe, wird UIImageView in Zelle 1 gut angezeigt, aber Zelle 2 UIImageView wird in Zelle 3 angezeigt. Lassen Sie mich wissen, wenn weitere Informationen benötigt werden.

Hier ist der Code, den ich in cellForIndexPath verwende:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("videoCell")! as! VideoCell
    cell.selectionStyle = UITableViewCellSelectionStyle.None // get rid of highlight when tapping a cell

    if videoCollections.count > 0 {
        let singleVideoCollection = videoCollections[indexPath.row]
        // get video clips from PFRelation
        let clips = singleVideoCollection.relationForKey("clips")
        let query = clips.query()

        query.findObjectsInBackgroundWithBlock { (clipObjects, error) -> Void in

            if error == nil {

                for (index, clip) in (clipObjects?.enumerate())! {
                    if index == 0 { // first clip

                        let firstThumbnailImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 54, height: 54))
                        firstThumbnailImageView.center = cell.center
                        firstThumbnailImageView.layer.cornerRadius = firstThumbnailImageView.frame.height / 2
                        firstThumbnailImageView.clipsToBounds = true
                        let thumbnail = clip.objectForKey("thumbnail")
                        thumbnail!.getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in
                            if (error == nil) {
                                firstThumbnailImageView.image = UIImage(data:imageData!)
                                cell.contentView.addSubview(firstThumbnailImageView)
                            }
                        }

                    }
                }
            }
        }

        return cell

    }
}

Dies ist das Ergebnis, wenn ich 2 Zellen habe. Beachten Sie, wie sich das zweite UIImageView in einer dritten Zelle befindet: Bildbeschreibung hier eingeben

2
cb428 4 Jän. 2016 im 05:49

2 Antworten

Beste Antwort

Zu dem Zeitpunkt, an dem getDataInBackgroundWithBlock den Download von imageData beendet hat, wurde das Zellenobjekt möglicherweise bereits für einen anderen Indexpfad wiederverwendet. Und wenn Sie dequeueReusableCellWithIdentifier und cell.contentView.addSubview() verwenden, werden Sie zu viele Unteransichten hinzufügen. Sie können also den folgenden Code ausprobieren.

class VideoCell: UITableViewCell {
//......
let firstThumbnailImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 54, height: 54))

override func prepareForReuse() {
  super.prepareForReuse()
  firstThumbnailImageView.image=nil;
}
//......
}


func tableView(tableView : UITableView, cellForRowAtIndexPath indexPath : NSIndexPath)->UITableViewCell {
//......
// let firstThumbnailImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 54, height: 54))

cell.firstThumbnailImageView.center = cell.center
cell.firstThumbnailImageView.layer.cornerRadius = firstThumbnailImageView.frame.height / 2
cell.firstThumbnailImageView.clipsToBounds = true
let thumbnail = clip.objectForKey("thumbnail")

//......

//cell.contentView.addSubview(firstThumbnailImageView)

//......
}
0
酷酷的哀殿 4 Jän. 2016 im 03:35

Wenn Sie die Wiederverwendung der Tabellenansichtszelle nicht gut verstehen, wird empfohlen, die versteckte Eigenschaft der UI-Elemente festzulegen, die mit dem indexPath in der Delegate-Methode verbunden sind.

Code wie folgt hinzufügen

if (clipObjects![indexPath.row].objectForKey("thumbnail")) {
    thumbnail.hidden = false
} else {
    thumbnail.hidden = true
}
0
Henson Fang 5 Jän. 2016 im 06:47