userdefaults 不保存按钮状态
Posted
技术标签:
【中文标题】userdefaults 不保存按钮状态【英文标题】:userdefaults not saving button state 【发布时间】:2021-07-18 16:27:58 【问题描述】:我正在学习 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)
但是当我点击时我的值没有很好地存储(在应用程序重新启动时,一些按钮没有有效的图片(值),有些有) 我应该使用按钮标签来实现这一点吗?如果我通过函数调用发送 sender 值有问题吗?
【问题讨论】:
在 UserDefaults 中存储此类信息是脆弱的。如果电影数组发生变化,并且应用程序启动时的索引不同,会发生什么情况?将选择错误的收藏夹。您真的应该为此考虑一个适当的本地存储机制,该机制将电影是否被收藏在与电影相同的位置。 【参考方案1】:虽然我认为您不应该使用 UserDefaults 来存储此信息,但问题在于您将值设置为 UserDefaults 的方式。
你正在使用
UserDefaults.standard.setValue(...
如果你在 Xcode 中命令点击setValue
,你会看到你被带到Foundation.NSKeyValueCoding
中的函数。您应该使用正确的 UserDefaults 函数
UserDefaults.standard.set(sender.isSelected, ...
正确编码类型。
【讨论】:
以上是关于userdefaults 不保存按钮状态的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UserDefaults 中重置“AppleLanguages”键的值