Ios “问题存储”;“最爱”;NSUserDefault中的按钮状态

Ios “问题存储”;“最爱”;NSUserDefault中的按钮状态,ios,swift,nsuserdefaults,Ios,Swift,Nsuserdefaults,不确定为什么没有存储我的按钮状态。图像从“未填充”更改为“已填充”,但当我从视图控制器中单击并返回时,图像将重置为“未填充” var recipeFav = UserDefaults.standard.bool(forKey: "recipeFav") @IBAction func FavButtonTapped(_ sender: Any) { if recipeFav { let image = UIImage(named: "starNonfil

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

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()
    }

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

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

  • 按照惯例,在Swift中,函数和属性以小写字母开头-这有助于将它们与类型区分开来
  • 您可以将操作函数声明为接收
    发送方
    ,将其声明为
    ui按钮
    ,从而避免了向下转换的需要
  • 您可以使用
    .toggle()
    切换布尔值
  • 您不需要调用
    synchronize()
我会将图像设置重构为自己的函数,并使用
didSet
处理程序调用它,并在值更改时保存布尔值。您还需要从
viewdide
获取当前值,以确保初始状态设置正确


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)
}