在UITableView中选择重复的行

时间:2018-03-04 17:36:22

标签: ios swift uitableview

我正在制作一个带有动态表格的应用程序,当我在表格中加载所有值并运行应用程序时,我将选中一个带有复选标记的行并向下滚动并查看其下方的另一行也会被选中选中标记。但是,它没有将该另一行的数据添加到我的数据中,它仍显示为已检查。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)
    // let genresFromLibrary = genrequery.collections
    let rowitem = genresFromLibrary![indexPath.row].representativeItem
    cell.textLabel?.text = rowitem?.value(forProperty: MPMediaItemPropertyGenre) as? String

    // Configure the cell...
    // cell.textLabel?.text =

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let rowitem = genresFromLibrary![indexPath.row].representativeItem
    print(rowitem?.value(forProperty: MPMediaItemPropertyGenre) as! String)
    tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark//places the checkmark

    GenresWanted.append(rowitem!)
}

override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    tableView.cellForRow(at: indexPath)?.accessoryType = .none
    ///we want to delete it from the array here
    let rowitem = genresFromLibrary![indexPath.row].representativeItem
    print("Removed: \(rowitem?.value(forProperty: MPMediaItemPropertyGenre) as! String)")
    if let index = GenresWanted.index(of: rowitem!)
    {
        GenresWanted.remove(at: index)
    }
}

以上是我的代码。我认为这可能与cellforRowAt有关,但我不确定。

2 个答案:

答案 0 :(得分:1)

背后的问题是重复使用单元格,因此您应该在.none

中将其设为cellForRow
var selected:IndexPath

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

  let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)

  if(selected.row == indexPath.row)
  {
     cell.accessoryType = .checkmark
  }
  else
  {
     cell.accessoryType = .none
  }


 }

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      selected = indexPath
      // here reload the cell at that indexPath
 }

答案 1 :(得分:-1)

您应该在表格视图单元格类中执行此操作,如<; p>

class YourTableViewCell:UITableViewCell {
    //This method is called when you select/deselect the cell and also when you reuse a cell
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        self.accessoryType  = selected ? .checkmark : .none;
    } 

    // ... Your code
}

并从didSelect / didDeselect方法中删除附件类型逻辑;

注意:如果您的表格视图单元格中没有附加任何类,您应该这样做来管理您的逻辑。