当我向下滚动tableview时,隐藏单元格的复选标记消失了

时间:2019-09-07 13:40:19

标签: swift tableview cell checkmark

滚动前启用复选标记的单元格:

cell with enabled checkmark before scrolling

向上滚动后具有禁用复选标记的单元格:

cells with disabled checkmarks after i have scrolled up

大家好,我已经创建了一个表格视图和一个添加按钮来添加新单元格。当我添加单元格并启用UITableViewCell.AccessoryType.checkmark时,当我滚动tableview时,复选标记消失,并且单元格从视图中消失。 我该如何解决?

   var waterValue = [String]()


    @IBAction func addButtonPressed(_ sender: Any) {




        let alert = UIAlertController(title: "add your amount of water for today", message: nil, preferredStyle: .alert)
        alert.addTextField(configurationHandler: {(waterAmountTodayTF) in waterAmountTodayTF.placeholder = "enter L for today"})
        alert.textFields?.first?.textAlignment = .center
        alert.textFields?.first?.becomeFirstResponder()
        alert.textFields?.first?.keyboardType = UIKeyboardType.decimalPad


        let action = UIAlertAction(title: "add", style: .default) {
            (_) in
            guard let waterAmountForToday = (alert.textFields?.first?.text) else { return }
            self.add("\(waterAmountForToday) L")
//            print(self.sliderValue)
        }
        alert.addAction(action)
        present(alert, animated: true)
    }



    func add(_ individualWaterAmount: String) {
        let index = 0
        waterValue.insert(individualWaterAmount, at: index)
        let indexPath = IndexPath(row: index, section: 0)
        tableView.insertRows(at: [indexPath], with: .left)
    }



    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 70.0
    }



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return waterValue.count
    }



    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        let individualWaterValues = waterValue[indexPath.row]
        cell.textLabel?.text = individualWaterValues
        cell.textLabel?.textAlignment = .right
        cell.selectionStyle = .none
        return cell
    }



    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCell.AccessoryType.checkmark {
           tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.none
        } else {
           tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.checkmark
        }
    }



    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        guard editingStyle == .delete else { return }
        waterValue.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .automatic)
    }

1 个答案:

答案 0 :(得分:0)

在创建新单元格时,您尚未添加将附件类型设置为选中标记的逻辑。

您需要做的是,保存所选的值,然后在创建新单元格时使用该值。

var selectedIndexes: [Int] = []; //global variable
...
...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        let individualWaterValues = waterValue[indexPath.row]
        cell.textLabel?.text = individualWaterValues
        cell.textLabel?.textAlignment = .right
        cell.accessoryType = selectedIndexes.contains(indexPath.row) ? UITableViewCell.AccessoryType.checkmark : UITableViewCell.AccessoryType.none
        return cell
    }


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCell.AccessoryType.checkmark {
           tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.none
           selectedIndexes.removeAll(where: { $0 == indexPath.row } )
        } else {
           tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.checkmark
           selectedIndexes.append(indexPath.row)
        }
    }