多重select在IOS中不能正常工作

我有一个问题,在iOS表格视图中设置行的复选标记如果我select上面的一个元素,下一个第13个元素也被选中,我不知道为什么?

在设置复选标记之前,我需要对表格做些什么,因为我只是检查一个条件,如果这种情况是真的,我将把accessoryType设置为复选标记,下面是代码。

注意: – 发生这种情况时,第13行不会被选中,只会改变该行的配件types。

if let cell = tableView.cellForRowAtIndexPath(indexPath) { if cell.selected { if(self.sections[indexPath.section].files[indexPath.row].type != "cloud"){ print(self.sections[indexPath.section].files[indexPath.row]) cell.accessoryType = .Checkmark NSNotificationCenter.defaultCenter().postNotificationName("enableOptions", object: nil) } } } 

CellForIndexPath代码:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MyFilesTableViewCell let fileSection = sections[indexPath.section] let file = fileSection.files[indexPath.row] cell.title.text = file.name if file.timeStamp.isEmpty{ cell.timeStamp.hidden = true }else{ cell.timeStamp.hidden = false cell.timeStamp.text = file.timeStamp } cell.icon.image = file.icon cell.actionsBtn.row = indexPath.row cell.actionsBtn.section = indexPath.section cell.actionsBtn.setTitle("\u{f142}", forState: .Normal) cell.actionsBtn.addTarget(self, action: #selector(MyFilesTableViewController.buttonClicked(_:)), forControlEvents: UIControlEvents.TouchUpInside) if(editingTable){ cell.actionsBtn.hidden = true }else{ cell.actionsBtn.hidden = false } if(file.type == "cloud"){ cell.actionsBtn.hidden = true } cell.progressBar.progress = 0.0 cell.progressBar.hidden = true return cell } 

它的问题在cellForRowAtIndexPath中可重用。 请使用下面的代码。

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MyFilesTableViewCell cell.accessoryType = .None if cell.selected { if(self.sections[indexPath.section].files[indexPath.row].type != "cloud"){ print(self.sections[indexPath.section].files[indexPath.row]) cell.accessoryType = .Checkmark } } let fileSection = sections[indexPath.section] let file = fileSection.files[indexPath.row] cell.title.text = file.name if file.timeStamp.isEmpty{ cell.timeStamp.hidden = true }else{ cell.timeStamp.hidden = false cell.timeStamp.text = file.timeStamp } cell.icon.image = file.icon cell.actionsBtn.row = indexPath.row cell.actionsBtn.section = indexPath.section cell.actionsBtn.setTitle("\u{f142}", forState: .Normal) cell.actionsBtn.addTarget(self, action: #selector(MyFilesTableViewController.buttonClicked(_:)), forControlEvents: UIControlEvents.TouchUpInside) if(editingTable){ cell.actionsBtn.hidden = true }else{ cell.actionsBtn.hidden = false } if(file.type == "cloud"){ cell.actionsBtn.hidden = true } cell.progressBar.progress = 0.0 cell.progressBar.hidden = true return cell } 

通过使用这种方法,您可以省略整个tableView reload并只修改您select的单元格内容。

创build一个存储所选单元格行信息的数组

 myArray:[Int] = [] 

在你的cellForRowAtIndexPath方法集中

 cell.actionsBtn.tag = indexPath.row myArray.insert(1, at: indexPath.row) 

代替

 cell.actionsBtn.row = indexPath.row` 

在你的buttonClicked(_:)方法中使用

  func buttonClicked( sender: AnyObject) { let indexPath = IndexPath(row: sender.tag, section: 0) let cell = tableView.cellForRow(at: indexPath) as! MyFilesTableViewCell if myArray[sender.tag] == 1 { cell.actionsBtn.setImage(UIImage(named:"checkmark_box"), for: .normal) myArray[sender.tag] = 0 } else { cell.actionsBtn.setImage(UIImage(named:"tick_mark"), for: .normal) myArray[sender.tag] = 1 } }