保存表格视图中的最爱按钮的状态NSUserDefaults中的单元格

问题描述:

我已经经历了许多这类问题的解决方案,但我仍然陷入困境,不知道如何将按钮的状态保存到NSUserDefaults中。保存表格视图中的最爱按钮的状态NSUserDefaults中的单元格

Here is the picture for demo

这是我泰伯维控制器

override func viewDidLoad() { 

    super.viewDidLoad() 
    navigationItem.title = "Contacts" 
    tableView.register(RecordCell.self, forCellReuseIdentifier: "cellId") 
} 


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let myCell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath as IndexPath) as! RecordCell 


    myCell.starButton.tag = indexPath.row 
    myCell.myTableViewController = self 
    return myCell 
} 

这是我的自定义单元格类

class RecordCell: UITableViewCell { 

var myTableViewController: HomepageController? 

override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    setupViews() 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

let nameLabel: UILabel = { 
    let label = UILabel() 
    label.translatesAutoresizingMaskIntoConstraints = false 
    label.font = UIFont (name: "SFCompactDisplay-Regular", size: 14) 
    return label 
}() 
let companyLabel: UILabel = { 
    let label = UILabel() 
    label.translatesAutoresizingMaskIntoConstraints = false 
    label.font = UIFont (name: "SFCompactDisplay-Light", size: 10) 
    return label 
}() 
let shortname: UILabel = { 
    let label = UILabel() 
    label.textColor = UIColor.white 
    label.translatesAutoresizingMaskIntoConstraints = false 
    label.font = UIFont (name: "SFCompactDisplay-Regular", size: 12) 
    label.textAlignment = .center 
    label.backgroundColor = UIColor(patternImage: UIImage(named: "avatar")!) 
    return label 
}() 
let starButton: UIButton = { 
    let button = UIButton(type: .system) 
    button.setImage(UIImage(named: "star"), for: .normal) 
    button.translatesAutoresizingMaskIntoConstraints = false 
    return button 
}() 
let playButton: UIButton = { 
    let button = UIButton(type: .system) 
    button.setImage(UIImage(named: "playback"), for: .normal) 
    button.translatesAutoresizingMaskIntoConstraints = false 
    return button 
}() 

func setupViews() { 
    addSubview(nameLabel) 
    addSubview(companyLabel) 
    addSubview(shortname) 
    addSubview(starButton) 
    addSubview(playButton) 

    starButton.addTarget(self, action: #selector(RecordCell.starAction), for: .touchUpInside) 

// playButton.addTarget(自我,动作:#selector(RecordCell.playAudio ),用于:.touchUpInside)

addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-8-[v4(40)]-8-[v0]-8-[v1(30)]-8-[v2(30)]-8-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel, "v1": starButton,"v2":playButton, "v4":shortname])) 
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-56-[v3]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v3": companyLabel])) 


    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-2-[v0][v3]-7-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel,"v3": companyLabel])) 
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": starButton])) 
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": playButton])) 
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-2-[v0(40)]-7-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": shortname])) 

} 

func starAction() { 
    starButton.setImage(UIImage(named:"star-active"), for: .normal) 
} 
+0

建议。将按钮的状态存储为用户默认值并不是一种好的编程习惯。 如果你真的想(重新)存储一个按钮的状态,一个更好的方法是有一个单例类并写入按钮的当前状态。 – kau5hik

+0

我是新来的Swift,不知道单身模式。我只是尝试一些简单的。顺便说一句,非常感谢你的建议。我会在后面考虑 – Van

附加标签作为变量RecordCell类像

class RecordCell: UITableViewCell { 

var myTableViewController: HomepageController? 
var favID:Int = 0 
.....//other code 
} 

的ViewController

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let myCell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath as IndexPath) as! RecordCell 

    myCell.favID = indexPath.row //set value to favID variable 
    myCell.myTableViewController = self 
    myCell.updateSelection() //call this method to update the selection 
    return myCell 
} 

RecordCell

override func awakeFromNib() { 
    super.awakeFromNib() 
    updateSelection() 
} 

func updateSelection() { 
    let key = "\(favID)" 
    let userDefault = UserDefault.standard 
    let isFav = userDefault.bool(forKey: key) 
    starButton.isSelected = isFav 
} 

let starButton: UIButton = { 
    let button = UIButton(type: .system) 
    button.setImage(UIImage(named: "star"), for: .normal) //add image for different states 
    button.setImage(UIImage(named:"star-active"), for: .selected) //add image for different states 
    button.translatesAutoresizingMaskIntoConstraints = false 
    return button 
}() 

func setupViews() { 
    .... 
    ....//other code 
    updateSelection() 
} 

func starAction() { 
    starButton.isSelected = !starButton.isSelected //toggle selection 
    let key = "\(favID)" 
    let userDefault = UserDefault.standard 
    userDefault.set(starButton.isSelected, forKey: key) 
    userDefault.synchronize() 
} 

这是一种基于索引的示例,如果可能的话就可以使用,其在表中显示为键的对象的任何唯一标识符。或者在数据模型本身中设置一个isFav变量。

+0

感谢您的答复,它确实切换,但状态没有正确保存,我想也许索引路径 – Van

+0

有问题,你有多个部分?现在救人的表现如何? – Akhilrajtr

+0

单击任意一行中的一个按钮,它不会保存仅用于该行的状态,如果我单击切换所有按钮,它确实保存所有 – Van

func starAction() { 

    let userDefault = UserDefault.standard 
     userDefault.set(true, forKey: "KEY_IS_SELECTED") 
    starButton.setImage(UIImage(named:"star-active"), for: .normal) 
} 

得到喜欢的按钮状态:

let userDefault = UserDefault.standard 
let state = userDefault.bool(forKey: "KEY_IS_SELECTED") 

//get stored state of button 
//use state of button 
+0

感谢您的回复,但问题是我希望用户可以基于isSelected属性切换按钮的状态,然后保存它。也基于联系人的每一行 – Van