UITableview原型单元格填充不正确

时间:2017-11-01 17:54:33

标签: ios swift uitableview

我正在尝试使用“Facebook状态”填充UITableView原型单元格。它具有图像和视频,具体取决于Facebook服务器的响应。但我无法正确填充它。

我将从阵列中获取第一张图片。但是,当我向下滚动UITableView并再次到达顶部时,图像消失。当我打印i的值时,它会在加载tableview后很快超过数组的数量。

我在这里添加编辑过的代码。

覆盖func tableView(_ tableView:UITableView,numberOfRowsInSection section:Int) - > Int {

    var rows : Int = 0
    if section < numberOfRowsAtSection.count{
        rows = numberOfRowsAtSection[section]
        print(section,rows)
    }
    return rows
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    print("Section,Row",indexPath.section, indexPath.row)
    switch(combinedArray[indexPath.section][indexPath.row]){
    case "photo" :
        let cell = tableView.dequeueReusableCell(withIdentifier: "ImageDetail", for:indexPath) as! imageCell
            if(im < imageDetails.count){
                let imageUrl = imageDetails[im]
                let url = URL(string:imageUrl)
                let data = try? Data(contentsOf: url!)
                cell.storyDetailsLbl1.text = photoStoryDetails[im]
                print(imageDetails[im])
                cell.images1.image = UIImage(data: data!)
            }
            im = im + 1

            return cell

    case "video" :
            let cell1 = tableView.dequeueReusableCell(withIdentifier: "VideoCell", for: indexPath) as! videoPlayerCell
            cell1.videoView.isHidden = false
            if  vd < videoURLs.count{
                print(videoURLs.count)
                let urls = videoURLs[vd]
                cell1.videoPlayerItem = AVPlayerItem.init(url: urls)
                cell1.videoLabel.text = videoStoryDetails[vd]
            }
            vd = vd + 1

            return cell1

    case "link":
            let cell2 = tableView.dequeueReusableCell(withIdentifier: "LinkCell", for: indexPath) as! linkCell
            if  ln < linkDetails.count {
                cell2.linkLbl.text = linkDetails[ln]
            }
            ln = ln + 1
            return cell2

    default:
             let cell3 = tableView.dequeueReusableCell(withIdentifier: "StatusCell", for: indexPath) as! statusCell
                if  st < statusDetails.count{
                    cell3.statusLbl.text = statusDetails[st]
                }
                st = st + 1
                return cell3
    }

}

1 个答案:

答案 0 :(得分:0)

Tableviews deque已经创建了单元格并重用它们来提高性能。因此,可以重用具有标识符“ImageDetail”的单元格,并使用来自任何case语句的数据填充该单元格。这会导致图像等奇怪现象消失。

解决此问题的一种方法是确保在每种情况下都处理每个单元属性。 cell.storyDetailsLbl1.text案件中未处理photocell.images1.image案例中未处理link

最好是为每个案例定义一个具有唯一标识符的单元格。即PhotoCellLinkCellVideoCell