关于TableView cell 重用的问题, 滑动消失之前的数据


代码如下


 //swift 语言
//定义一个数组
    var FaxianListC = [
                        0:["name":"123","img":"123"],
                        1:["name":"234","img":"123"],
                        2:["name":"456","img":"123"],
                        3:["name":"6567","img":"123"],
                        4:["name":"546","img":"123"],
                        5:["name":"546","img":"123"],
                        6:["name":"546","img":"123"],
                        7:["name":"546","img":"123"]
                            ]


 //实现
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{

        var cellid = "FaxianID"
        var index = indexPath.row

        var cell:UITableViewCell? = FaxianList.dequeueReusableCellWithIdentifier(cellid) as? UITableViewCell
        if(cell == nil){
            cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: cellid)
        }
        cell!.textLabel!.text = FaxianListC[index]?.removeValueForKey("name")
        cell!.accessoryType = UITableViewCellAccessoryType.DetailButton
        return cell!
    }

正常情况如下
clipboard.png
上下滑动 内容全部消失
clipboard.png

clipboard.png

ios swift

貝阿朵莉切 9 years, 4 months ago

问题出在这一行代码上:


 cell!.textLabel!.text = FaxianListC[index]?.removeValueForKey("name")

UITableView会根据reuseId来重用cell,意味着cell在结束显示后就可能被回收,而在重新显示时再恢复回来。所以,可以认为cell划出屏幕时,cell对象就被回收了,而被回收的cell又提供给了新出现的cell使用,所以cell.textLabel.text就会被新的值所覆盖。而题主的代码中在第一次显示第i行的cell时将第i行所对应的name移除了,在第i行的cell第二次被显示时就会得不到对应的name,所以滚动后cell.textLabel.text就为空了。

解决方案:
在取得cell对应的name值之后不将其移除,而是一直保留在集合中。

传说中的哥特 answered 9 years, 4 months ago

Your Answer