Checkmarks in UITableViewCells showing incorrectly

早过忘川 提交于 2020-01-17 03:26:07

问题


I have a small scrollable tableView which displays roughly eight rows, when I select a row a checkmark appears, when I select it again it disappears.

The issue is, as I scroll down and the cells are reused, more rows are automatically checked. What is the best practice for tracking which rows require a checkmark so that this does not happen. I have looked everywhere but haven't found Swift solution that works well.

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

    let cell = tableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell

    cell.textLabel?.text = "\(searchResults.usernameUserSearchArray[indexPath.row])"

    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let selectedCell = tableView.cellForRowAtIndexPath(indexPath)

    if selectedCell?.accessoryType == UITableViewCellAccessoryType.Checkmark {

        selectedCell?.accessoryType = UITableViewCellAccessoryType.None

    } else {

        selectedCell?.accessoryType = UITableViewCellAccessoryType.Checkmark
    }

    tableView.reloadData()
}

回答1:


Wouldn't something like this do it for you? I haven't tested it since I am not on my Mac.

var selectedCells = [NSIndexPath]()

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell")!
    cell.accessoryType = selectedCells.contains(indexPath) ? .Checkmark : .None

    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let selectedCell = tableView.cellForRowAtIndexPath(indexPath)

    selectedCells.append(indexPath)

    if selectedCell?.accessoryType == .Checkmark {

        selectedCell?.accessoryType = .None

        selectedCells = selectedCells.filter {$0 != indexPath}

    } else {

        selectedCell?.accessoryType = .Checkmark
    }
}



回答2:


In didSelectRowAtIndexPath create an NSMutableArray which stores selected index of the cell and in cellForRowAtIndexPath check using if condition from array whether index path is available in array or not. If available than set accessory type checkmark true for index path.




回答3:


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

    let cell = tableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell

    cell.textLabel?.text = arr.objectAtIndex(indexPath.row) as? String
    if(arr .objectAtIndex(indexPath.row) as! String  == selectedValue.objectAtIndex(indexPath.row) as! String)
    {
       cell.accessoryType = UITableViewCellAccessoryType.Checkmark
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryType.None
    }
    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let selectedCell = tableView.cellForRowAtIndexPath(indexPath)

    if selectedCell?.accessoryType == UITableViewCellAccessoryType.Checkmark {

        selectedCell?.accessoryType = UITableViewCellAccessoryType.None
        selectedValue .removeObject(arr .objectAtIndex(indexPath.row))

    } else {

        selectedCell?.accessoryType = UITableViewCellAccessoryType.Checkmark
        selectedValue .addObject(arr .objectAtIndex(indexPath.row))
    }


}


来源:https://stackoverflow.com/questions/34369939/checkmarks-in-uitableviewcells-showing-incorrectly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!