Сохранить состояние выбора кнопки в строке UITableView (Swift) - PullRequest
0 голосов
/ 02 июня 2018

У меня есть кнопка с именем btnChk2 в строке UITableview.Когда пользователь нажимает btnChk2, кнопка btnChk выбирается.Приведенный выше код работает, чтобы это произошло, но когда я закрываю приложение и снова открываю его, статус флажка не совпадает, например, я хочу, чтобы, если установлен флажок строки, я хотел, чтобы пользователь покинулприложение и возвращаемый один и тот же флажок остаются выбранными, пробовал с NSUserDefaults, но не работал со мной.

Вот код, который работает, но не сохраняет состояние флажка:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "CheckBoxCell")
    if let lbl = cell?.contentView.viewWithTag(1) as? UILabel {
        lbl.text = "item-\(1)"
    }

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

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

@objc func checkboxClicked(_ sender: UIButton) {

    guard let cell = sender.superview?.superview as? UITableViewCell else {
        return
    }

    if  sender.tag == 2 {

        if let btnChk2 = cell.contentView.viewWithTag(100) as? UIButton {
            if btnChk2.isSelected == true {
                btnChk2.isSelected = false
            }else{
                btnChk2.isSelected = true
            }
        }
        sender.isSelected = false
    }else if sender.tag == 100{
        if let btnChk = cell.contentView.viewWithTag(2) as? UIButton {
            if btnChk.isSelected == true {
                btnChk.isSelected = false

            }else{
                btnChk.isSelected = true
            }
        }
    }
}

Ответы [ 2 ]

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

Вы можете сохранить выбранный номер кнопки в NSUserDefault, а затем использовать его в cellForRowAtIndexpath.вроде как

NSString *valueToSave = @"button1";
[[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"SelectedButton"];
[[NSUserDefaults standardUserDefaults] synchronize];

NSString *savedValue = [[NSUserDefaults standardUserDefaults]
    stringForKey:@"SelectedButton"];

Затем в cellForRowAtIndexpath вы можете проверить значения NSUserDefaults

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

Хорошее предложение - не использовать userdefault для этой цели, пользовательское значение по умолчанию используется только для пользовательских настроек. Лучше использовать данные ядра или сохранить их в файле plist.в любом случае вот решение с использованием UserDefaults.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell : UITableViewCell!
    // code to check for a particular tableView to display the data .
    if tableView == ScheduleTableView{



        cell = tableView.dequeueReusableCell(withIdentifier: "ScheduleCell", for: indexPath as IndexPath)
        let lblCity = cell.viewWithTag(1)as! UILabel
        lblCity.text = ScheduleArray[indexPath.row] as String

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

        if let btnChk2 = cell.contentView.viewWithTag(22) as? UIButton {

            btnChk2.isSelected = (UserDefaults.standard.integer(forKey: String(format: "indexpath%d", (indexPath.row))) == indexPath.row) ? true : false
        }  
    }
    if tableView == GoalsTableView{
        cell = tableView.dequeueReusableCell(withIdentifier: "GoalsCell", for: indexPath as IndexPath)
        let lbl3 = cell.viewWithTag(2)as! UILabel
        lbl3.text = GoalsArray[indexPath.row]as? String
    }
    return cell
}


@objc func checkboxClicked(_ sender: UIButton) {
    print("AAAA")

    // sender.isSelected = !sender.isSelected


    guard let cell = sender.superview?.superview as? UITableViewCell else {
        return
    }

    let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to:self.ScheduleTableView)
    let indexPath = self.ScheduleTableView.indexPathForRow(at: buttonPosition)

    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: String(format: "indexpath%d", (indexPath?.row)!))

            }else{
                btnChk2.isSelected = true
                UserDefaults.standard.set(indexPath?.row, forKey: String(format: "indexpath%d", (indexPath?.row)!))
            }
        }
        sender.isSelected = false
    }


}
...