保存 UITableView 行中按钮的 select 状态 (Swift)
Save the select state of a button in UITableView row (Swift)
我在 UITableview
行上有一个名为 btnChk2
的按钮。当用户按下 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
}
}
}
}
建议不要为此使用userdefault,user default仅用于用户设置目的,最好使用核心数据或保存在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
}
}
您可以将选定的按钮编号保存在 NSUserDefault 中,然后在您的 cellForRowAtIndexpath 中使用相同的编号。
像
NSString *valueToSave = @"button1";
[[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"SelectedButton"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSString *savedValue = [[NSUserDefaults standardUserDefaults]
stringForKey:@"SelectedButton"];
然后在 cellForRowAtIndexpath 中,您可以检查 NSUserDefaults
中的值
我在 UITableview
行上有一个名为 btnChk2
的按钮。当用户按下 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
}
}
}
}
建议不要为此使用userdefault,user default仅用于用户设置目的,最好使用核心数据或保存在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
}
}
您可以将选定的按钮编号保存在 NSUserDefault 中,然后在您的 cellForRowAtIndexpath 中使用相同的编号。 像
NSString *valueToSave = @"button1";
[[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"SelectedButton"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSString *savedValue = [[NSUserDefaults standardUserDefaults]
stringForKey:@"SelectedButton"];
然后在 cellForRowAtIndexpath 中,您可以检查 NSUserDefaults
中的值