iOS tableView自定义多选

tableView列表中会有单选和多选功能,cell多是自定义,网上的一些文章逻辑都比较复杂,主要问题还是要梳理清楚。实现方式:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell:FamilyRoomTableViewCell! = tableView.dequeueReusableCell(withIdentifier: "room", for: indexPath) as? FamilyRoomTableViewCell
            cell.selectionStyle = .none
            cell.selectedBtn.tag = indexPath.row + 1000
            //模型赋值
            cell.setmodel(model: self.roomListArray![indexPath.row])
            cell?.changeModelBlock = { (tag) ->Void in
                cell.roomModel = self.roomListArray![tag-1000]
                if cell.roomModel?.isRoomSelected == "0" {
                    cell.roomModel?.isRoomSelected = "1"
                    self.roomNameArray.append((cell.roomModel?.groupName)!)
                }else {
                    cell.roomModel?.isRoomSelected = "0"
                    //array没有移除object元素的方法,所以采用filter函数进行过滤
                    //使用nsmutableArray方法移除当前的object,如果是可选类型,打印出来的值带有option字样,如果不是可选类型,打印出来的值为unicode码(暂时不知道原因)
                     self.roomNameArray = self.roomNameArray.filter({$0 != cell.roomModel?.groupName})
                }
                //重新赋值这一步很关键
                self.roomListArray![tag-1000] = cell.roomModel!
                self.familyTableView.reloadData()
                print("**********当前的房间数组*********\(String(describing: self.roomNameArray))")
            }
            return cell
    }

思路:根据btn的tag与cell的indexPath关联,模型里手动添加isRoomSelected字段判断是否选中,如果是放在该方法根据isRoomSelected去改变btn的背景图片的选择状态,由于cell的重用机制,在滑动的时候会导致btn的图片勾选状态错乱。
解决问题关键:将选中状态与model进行绑定,解决重用问题
cell中的代码

    func setmodel(model:HouseDeviceGroupModel?) {
        roomModel = model
        roomNameLabel.text = model?.groupName
        selectedBtn.isSelected = (model?.isRoomSelected == "1")
//        // 按钮默认选中
        if selectedBtn.isSelected {
            //选中
            selectedBtn.setImage(UIImage(named: "xuanze_on"), for: .normal)
        }else {
            //不选中
            selectedBtn.setImage(UIImage(named: "xuanze_off"), for: .normal)
        }
    }

最终效果如下:


2222.gif

完美解决重用问题

你可能感兴趣的:(iOS tableView自定义多选)