Флажок в UITableView не работает при удалении строки - PullRequest
0 голосов
/ 13 июня 2018

Я установил флажок в контроллере UITableView, он работает отлично, но когда флажок установлен и строки в табличном представлении удалены, и когда я добавляю новую строку в табличное представление, он выбирается.Вот ссылка на мой проект: https://files.fm/f/tepkz2du Я думаю, что это связано с удалением строки, путь к индексу запутан.

ОБНОВЛЕННЫЙ КОД:

cellForRowAt:

if let btnChk3 = cell?.contentView.viewWithTag(100) as? UIButton {
            btnChk3.addTarget(self, action: #selector(checkboxClicked(_ :)), for: .touchUpInside)
        }

if let btnChk2 = cell.contentView.viewWithTag(22) as? UIButton {
        btnChk2.isSelected = UserDefaults.standard.integer(forKey: myarray[indexPath.row]) == (indexPath.row + index) ? true : false
    }

checkboxClicked

    let defaults = UserDefaults.standard
    let myarray = defaults.stringArray(forKey: "ScheduleArray") ?? [String]()
    if  sender.tag == 100 {

        if let btnChk2 = cell.contentView.viewWithTag(22) as? UIButton {
            if btnChk2.isSelected == true {
                btnChk2.isSelected = false
                UserDefaults.standard.set(-1, forKey: myarray[(indexPath?.row)!] )
                UserDefaults.standard.synchronize()

            }else{
                btnChk2.isSelected = true
                UserDefaults.standard.set((indexPath?.row)! + index, forKey: myarray[(indexPath?.row)!])
                UserDefaults.standard.synchronize()
            }
        }
        sender.isSelected = false
    }

editStyle == .delete:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

    if tableView == ScheduleTableView{


        let defaults = UserDefaults.standard
        var myarray = defaults.stringArray(forKey: "ScheduleArray") ?? [String]()
        print(myarray)
        myarray.remove(at: indexPath.row)
        defaults.set(myarray, forKey: "ScheduleArray")
        ScheduleTableView.deleteRows(at: [indexPath], with: .fade)


    }
 }

Ответы [ 4 ]

0 голосов
/ 14 июня 2018

Не сохраняйте путь индекса в UserDefaults, сохраняйте любое значение, которое вы показываете в ячейке таблицы.И сопоставьте его с массивом в cellForRowAtIndex.как я сделал

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let c = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! tabCell
    c.lblC.text = arry?[indexPath.row]
    /* for example
     arry = ["First","Second","Third","Fourth","Fifth","Sixth","Seventh","eight","Ninth","Tenth"]
    seleted = ["First","Fifth"]
    */
    print("indexpath--",indexPath.row)
    if selected != nil
    {
        if (selected?.contains((arry?[indexPath.row])!))!
        {
            c.btnCheck.setBackgroundImage(#imageLiteral(resourceName: "check.png"), for: .normal)
        }
        else
        {
            c.btnCheck.setBackgroundImage(#imageLiteral(resourceName: "uncheck.png"), for: .normal)
        }


    }
    c.btnCheck.tag = indexPath.row
    c.btnCheck.addTarget(self, action:#selector(btnCheckClick(btn:)) , for: .touchUpInside)
    return c
}

Я не могу запустить ваш код ... вот так я и сделал свою демонстрацию проверить, надеюсь, у вас есть идея ... https://files.fm/u/hj7jz9dj

0 голосов
/ 13 июня 2018

Вы сохраняете в userdefaults значение отмеченной кнопки в соответствии с ее indexpath.Проблема с этим отношением заключается в том, что когда вы удаляете ячейку, новая ячейка получает индексный путь предыдущей ячейки, что неверно.

Вы должны работать с моделью для представления ваших строк.Сохраните в «ScheduleArray» объект, а не просто строку.

Примерно так:

struct myRow {
    var title: String = ""
    var isSelected: Bool = false
}
0 голосов
/ 13 июня 2018
if let btnChk2 = cell.contentView.viewWithTag(22) as? UIButton {
            btnChk2.isSelected = UserDefaults.standard.integer(forKey: myarray[indexPath.row]) == (indexPath.row + index) ? true : false
        }

ИЗМЕНИТЬ В cellForRowAt

 let defaults = UserDefaults.standard
        let myarray = defaults.stringArray(forKey: "ScheduleArray") ?? [String]()
if  sender.tag == 100 {

            if let btnChk2 = cell.contentView.viewWithTag(22) as? UIButton {
                if btnChk2.isSelected == true {
                    btnChk2.isSelected = false
                    UserDefaults.standard.set(-1, forKey: myarray[(indexPath?.row)!] )
                    UserDefaults.standard.synchronize()

                }else{
                    btnChk2.isSelected = true
                    UserDefaults.standard.set((indexPath?.row)! + index, forKey: myarray[(indexPath?.row)!])
                    UserDefaults.standard.synchronize()
                }
            }
            sender.isSelected = false
        }

ИЗМЕНИТЬ В ЧекбоксЩелкнуть

0 голосов
/ 13 июня 2018

Вы можете использовать метод func prepareForReuse() в UITableViewCell, чтобы убедиться, что флажок не установлен при вставке новой строки.

...