Swift中如何从数组移除未勾选标记行对应的数据?
解决UITableView勾选/取消勾选时数组数据同步问题
看起来你已经搞定了勾选单元格时把数据加入数组的部分,现在就差取消勾选时从数组里移除对应数据对吧?其实只需要在点击事件里加个反向判断,处理取消勾选的逻辑就行,我给你捋清楚步骤:
首先,你得有两个核心数组:
- 一个是数据源数组(比如叫
dataSource),用来存tableView所有行的原始数据 - 一个是选中数据数组(比如叫
selectedItems),用来存你勾选的行对应的数据
然后修改你的didSelectRowAt方法,完整代码如下:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard tableView == tableView_1 else { return } // 获取当前点击的单元格和对应的数据 let cell = tableView_1.cellForRow(at: indexPath)! let selectedItem = dataSource[indexPath.row] // 这里替换成你的数据源数组 // 判断当前勾选状态,做对应操作 if cell.accessoryType == .none { // 未勾选 → 勾选,添加数据到选中数组 cell.accessoryType = .checkmark // 避免重复添加,先判断是否已存在 if !selectedItems.contains(selectedItem) { selectedItems.append(selectedItem) } } else { // 已勾选 → 取消勾选,从选中数组移除数据 cell.accessoryType = .none // 找到数据在数组中的位置并删除 if let removeIndex = selectedItems.firstIndex(of: selectedItem) { selectedItems.remove(at: removeIndex) } } // 可选操作:点击后取消行的高亮状态,体验更友好 tableView.deselectRow(at: indexPath, animated: true) }
另外还有个重要的细节要注意:tableView的单元格复用问题,如果不处理,滑动页面后勾选状态可能会错乱。所以你需要在cellForRowAt方法里,根据selectedItems的内容来设置单元格的勾选状态:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "你的CellID", for: indexPath) let item = dataSource[indexPath.row] // 设置单元格显示内容 cell.textLabel?.text = item // 根据选中数组设置勾选状态 cell.accessoryType = selectedItems.contains(item) ? .checkmark : .none return cell }
如果你的数据是自定义模型(不是String),那记得让模型遵守Equatable协议,这样contains和firstIndex(of:)才能正常工作。如果不想遵守协议,也可以用firstIndex(where:)来通过模型的唯一标识判断,比如:
// 假设你的模型有个唯一id属性 if let removeIndex = selectedItems.firstIndex(where: { $0.id == selectedItem.id }) { selectedItems.remove(at: removeIndex) }
这样就能完美实现勾选添加、取消勾选移除的功能啦!
内容的提问来源于stack exchange,提问作者Burak Nurçicek
相关产品推荐
相关产品推荐

