ios – 我的表视图在滚动时在SWIFT中重用所选单元格

早上好

我的问题是,当我向下滚动向上时,我的表视图重用所选单元格.我的意思是当我从上向下选择一个单元格然后向下滚动时,我选择的一些单元格被选中,也有一些选中的单元格是当我再次向上滚动时没有显示选中,当发生这种情况时我再次选择苹果不仅仅是一个必须不被允许的单元格..我想提一下,我试图从’didSelectRowAtIndexPath’和我保存旧的索引路径在’CellForRowAtIndexPath’中检查它,但它不起作用:

if (old == indexpath)
{
        cell?.backgroundColor = UIColor.redColor()
        cell?.textLabel?.backgroundColor = UIColor.whiteColor() //to change only the thumbnail color and keep the cell color 
}

else {
        cell?.backgroundColor = UIColor.whiteColor()
}

在这是我的代码

func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = myTable.dequeueReusableCellWithIdentifier("WorkCell") as UITableViewCell
    cell.tag = (indexPath.row) + 1
    cell.textLabel?.text = Berufs[indexPath.row]
    var img = UIImageView(frame: CGRect(x: 10,y: 3,width: 40,height: 40))
    cell.selectionStyle = UITableViewCellSelectionStyle.None
    img.image = UIImage(named: "transparent.png")
    cell.indentationLevel = 1
    cell.indentationWidth = 45
    cell.addSubview(img)
    return cell
}

var old = 1000

func tableView(tableView: UITableView,didSelectRowAtIndexPath indexPath: NSIndexPath)
{
    let indexPath = tableView.indexPathForSelectedRow()
    let cell = tableView.cellForRowAtIndexPath(indexPath!)
    var tmpCell = view.viewWithTag(old)
    var rowNum = (cell?.tag)! - 1

    if (cell?.backgroundColor == UIColor.redColor())
    {
        cell?.backgroundColor = UIColor.whiteColor()
    }
    else if (cell?.backgroundColor != UIColor.redColor())
    {
        tmpCell?.backgroundColor = UIColor.whiteColor()
        cell?.backgroundColor = UIColor.redColor()
        cell?.textLabel?.backgroundColor = UIColor.whiteColor()

        println("du inteRSSiert dich für \(Berufs[rowNum])")
    }

    old = rowNum + 1

}

解决方法

您当前将选择状态存储在backgroundColor中.这不是一个好主意,因为出于性能原因,tableView将重用单元格.

您应该将选定的indexPath保存在数据模型中.如果要允许多个选择,可以将选定的indexPath存储在NSMutableSet中.

override func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell",forIndexPath: indexPath) as UITableViewCell
    cell.selectionStyle = .None
    configure(cell,forRowAtIndexPath: indexPath)
    return cell
}

var selectedindexPaths = NSMutableSet()

func configure(cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) {
    cell.textLabel!.text = "Row \(indexPath.row)"
    if selectedindexPaths.containsObject(indexPath) {
        // selected
        cell.backgroundColor = UIColor.redColor()
    }
    else {
        // not selected
        cell.backgroundColor = UIColor.whiteColor()
    }
}


override func tableView(tableView: UITableView,didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if selectedindexPaths.containsObject(indexPath) {
        // deselect
        selectedindexPaths.removeObject(indexPath)
    }
    else {
        // select
        selectedindexPaths.addobject(indexPath)
    }
    let cell = tableView.cellForRowAtIndexPath(indexPath)!
    configure(cell,forRowAtIndexPath: indexPath)
}

如果您只需要单个选择,则应将选定的indexPath保存在NSIndexPath中?实例变量

override func tableView(tableView: UITableView,forRowAtIndexPath: indexPath)
    return cell
}

var selectedindexPath: NSIndexPath?

func configure(cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) {
    cell.textLabel!.text = "Row \(indexPath.row)"
    if selectedindexPath == indexPath {
        // selected
        cell.backgroundColor = UIColor.redColor()
    }
    else {
        // not selected
        cell.backgroundColor = UIColor.whiteColor()
    }
}

override func tableView(tableView: UITableView,didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if selectedindexPath == indexPath {
        // selected same cell -> deselect all
        selectedindexPath = nil
    }
    else {
        // select different cell
        let oldSelectedindexPath = selectedindexPath
        selectedindexPath = indexPath

        // refresh old cell to clear old selection indicators
        var prevIoUsSelectedCell: UITableViewCell?
        if let prevIoUsSelectedindexPath = oldSelectedindexPath {
            if let prevIoUsSelectedCell = tableView.cellForRowAtIndexPath(prevIoUsSelectedindexPath) {
                configure(prevIoUsSelectedCell,forRowAtIndexPath: prevIoUsSelectedindexPath)
            }
        }
    }
    let selectedCell = tableView.cellForRowAtIndexPath(indexPath)!
    configure(selectedCell,forRowAtIndexPath: indexPath)
}

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...