ios - userdefaults 不保存按钮状态
问题描述
我正在学习 UserDefaults,我正在使用 UserDefaults 在其中存储按钮状态并在重新启动应用程序时使用它们。
我的 viewController 有两个按钮,单击按钮图像会更改。代表按钮目标的函数:
extension DetailViewController{
@objc func checkButtonTapped(sender: UIButton) {
detailViewModel?.watchedButtonPressed(sender: sender)
setupButton(sender: sender, button: .check)
}
@objc func favoriteButtonTapped(sender: UIButton) {
detailViewModel?.favoriteButtonPressed(sender: sender)
setupButton(sender: sender, button: .favorite)
}
}
更改按钮状态并将状态值保存在 UserDefault 中的功能。
func watchedButtonPressed(sender: UIButton){
sender.isSelected = !sender.isSelected
UserDefaults.standard.setValue(sender.isSelected, forKey: "mvvmCheck\(movieIndex ?? 0)")
}
func favoriteButtonPressed(sender: UIButton){
sender.isSelected = !sender.isSelected
UserDefaults.standard.setValue(sender.isSelected, forKey: "mvvmFavorite\(movieIndex ?? 0)")
}
单击时更改按钮图像的功能:
func setupButton(sender: UIButton, button: buttonType){
switch button {
case .favorite:
sender.setImage(UIImage(systemName: "star"), for: .normal)
sender.setImage(UIImage(systemName: "star.fill"), for: .selected)
case .check:
sender.setImage(UIImage(systemName: "checkmark.seal"), for: .normal)
sender.setImage(UIImage(systemName: "checkmark.seal.fill"), for: .selected)
}
}
启动应用程序时设置按钮图像的功能:
func setupButtons(){
buttonChecked.isSelected = UserDefaults.standard.bool(forKey: "mvvmCheck\(detailViewModel?.movieIndex ?? 0)")
buttonFavorite.isSelected = UserDefaults.standard.bool(forKey: "mvvmFavorite\(detailViewModel?.movieIndex ?? 0)")
setupButton(sender: buttonChecked, button: .check)
setupButton(sender: buttonFavorite, button: .favorite)
}
但是当我点击时我的值没有很好地存储(在应用程序重新启动时,一些按钮没有有效的图片(值),有些按钮有)我应该使用按钮标签来实现这一点吗?如果我通过函数调用发送发件人值有问题吗?
解决方案
尽管我认为您不应该使用 UserDefaults 来存储此信息,但问题在于您将值设置为 UserDefaults 的方式。
您正在使用
UserDefaults.standard.setValue(...
如果你setValue
在 Xcode 中点击命令,你会看到你被带到Foundation.NSKeyValueCoding
. 您应该改用正确的 UserDefaults 函数
UserDefaults.standard.set(sender.isSelected, ...
正确编码类型。
推荐阅读
- javascript - JS中数字原型的自定义迭代器
- c# - Task中的异常属性什么时候可以有值?
- r - 在 R 中标记日文文本:仅对指定列的第一行进行标记
- linux - 如何从使用 ssh 连接的 aws vm 运行 gui 应用程序?
- php - 命令模式+分页
- ios - 2个UIDatepickerView在一个ViewController中
- r - 与由颜色和线型定义的 ggplot2 线和点的 4 向交互
- google-cloud-platform - 在 Data Studio 中连接基于列的时间分区 BigQuery 表
- php - 在 php7 中发布 ajax 数据的问题
- python - 匹配和提取长域的正则表达式