在UITableViewCell(swift 3 xcode)中选择更改图像

时间:2017-06-19 10:51:57

标签: ios uitableview tableviewcell

我在tableViewCell中有一个imageView,我希望在选择时更改其图像。这是我的代码:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let myCell = tableView.cellForRow(at: indexPath) as! TableCell
    myCell.resourceIcons.image = UIImage(named: "RubiusResources2")
    tableView.deselectRow(at: indexPath, animated: true)

}

代码可以工作,但是tableView中不同部分的其他一些行似乎也发生了变化。

编辑:

使用下面的评论我得到了以下解决方案:

我首先创建了一个2D bool数组,用于我的表所具有的部分和行数,并将它们全部设置为false。

var resourceBool = Array(repeating: Array(repeating:false, count:4), count:12)

然后我创建了一个if语句来检查indexPath中的数组是假的还是真的。这将是图像状态发生变化的地方。

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

    let myCell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! TableCell

    if (global.resourceBool[indexPath.section][indexPath.row] == false) {
        myCell.resourceIcons.image = global.systemResourceImages[0]
    } else if (global.resourceBool[indexPath.section][indexPath.row] == true) {
        myCell.resourceIcons.image = global.systemResourceImages[1]
    }

    return myCell
}

然后,在didSelectRow函数中,我将indexPath处的数组更改为true并重新加载tableView数据。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    global.resourceBool[indexPath.section][indexPath.row] = true
    tableView.reloadData()
    tableView.deselectRow(at: indexPath, animated: true)

}

根据我的理解,对象的状态必须始终在cellForRow中。

1 个答案:

答案 0 :(得分:2)

其中一个解决方案是您需要维护所选行的单独列表,并在node_modules方法中进行比较。

代码看起来像这样。

site

然后在cellForRowAt中,编写此代码以设置正确的图像

var selectedArray : [IndexPath] = [IndexPath]()

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let myCell = tableView.cellForRow(at: indexPath) as! TableCell
    myCell.resourceIcons.image = UIImage(named: "RubiusResources2")
    tableView.deselectRow(at: indexPath, animated: true)

    if(!selectedArray.contains(indexPath))
    {
        selectedArray.append(indexPath)
    }
    else
    {
        // remove from array here if required
    }
}