问题在NSUserDefaults中存储“收藏夹”按钮状态

时间:2020-06-10 23:43:07

标签: ios swift nsuserdefaults

不确定为什么我的按钮状态没有被存储。图像从未填充变为填充,但是当我从视图控制器中单击并返回时,图像被重置为未填充。

var recipeFav = UserDefaults.standard.bool(forKey: "recipeFav")

@IBAction func FavButtonTapped(_ sender: Any) {

        if recipeFav {
            let image = UIImage(named: "starNonfill")
            (sender as AnyObject).setImage(image, for: .normal)
        } else {
            let image = UIImage(named: "starFilled")
            (sender as AnyObject).setImage(image, for: .normal)
        }

        recipeFav = !recipeFav
        UserDefaults.standard.set(recipeFav, forKey: "recipeFav")
        UserDefaults.standard.synchronize()
    }

1 个答案:

答案 0 :(得分:0)

您的主要问题是,您似乎没有任何代码会在视图出现时根据布尔值设置按钮图像-您可以从用户默认设置中检索按钮图像,而仅在用户点击按钮时设置图像。

您也可以进行其他一些更改:

  • 按照约定,在Swift中,函数和属性以小写字母开头-这有助于您将它们与类型区分开。
  • 您可以将动作函数声明为以sender的形式接收UIButton,从而避免向下转换。
  • 您可以使用.toggle()来切换布尔值
  • 您不需要致电synchronize()

我会将图像设置重构为它自己的函数,并使用didSet处理程序来调用它,并在值更改时保存布尔值。您还需要从viewDidAppear获取当前值,以确保正确设置了初始状态。


var recipeFav = false {
    didSet {
        UserDefaults.standard.set(recipeFav,forKey:"recipeFav")
        self.updateFavouriteButton()
    }
}

@IBOutlet weak var favouriteButton: UIButton!

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.recipeFav = UserDefaults.standard.bool(forKey:"recipeFav")
}

@IBAction func favButtonTapped(_ sender: UIButton) {
    self.recipeFav.toggle()
}

private func updateFavouriteButton() {
    let image = self.recipeFav ? UIImage(named: "starNonfill") : UIImage(named: "starFilled")
    self.favouriteButton.setImage(image, for: .normal)
}