以编程方式将UIImageView添加到UITableViewCell

时间:2016-01-04 02:49:37

标签: ios swift uitableview

我有一个自定义UITableViewCell,可以显示带有缩略图的视频。我是以编程方式添加缩略图UIImageView。但是,当我的UITableView中有一行以上时, UIImageView显示在其他所有单元格中。例如,如果我有2个单元格,UIImageView在单元格1中显示正常,但单元格2 UIImageView在单元格3中显示。抱歉,如果这令人困惑。如果还需要更多信息,请告诉我。

以下是我在cellForIndexPath中使用的代码:

 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

    }
}

这是我有2个细胞时的结果。注意第二个UIImageView如何在第三个单元格中: enter image description here

2 个答案:

答案 0 :(得分:0)

如果您不理解重复使用tableview单元格,建议您在委托方法中设置与元素绑定的UI元素的隐藏属性。

添加像这样的代码

if (clipObjects![indexPath.row].objectForKey("thumbnail")) {
    thumbnail.hidden = false
} else {
    thumbnail.hidden = true
}

答案 1 :(得分:0)

getDataInBackgroundWithBlock完成下载imageData时,单元格对象可能已经被重用于不同的indexPath。 当您使用dequeueReusableCellWithIdentifiercell.contentView.addSubview()时,您将添加过多的子视图。 所以你可以尝试以下代码。

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)

//......
}