ios - 问题在 NSUserDefaults 中存储 "Favourite"按钮状态

标签 ios swift nsuserdefaults

不知道为什么我的按钮状态没有被存储。图像从未填充变为已填充,但是当我单击 View Controller 并返回时,它被重置为未填充。

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

最佳答案

您的主要问题是,您似乎没有任何代码可以在 View 出现时根据 bool 值设置按钮图像 - 您从用户默认值中检索它,但只有在用户点击按钮后才设置图像。

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

  • 按照惯例,在 Swift 中,函数和属性以小写字母开头——这有助于您将它们与类型区分开来。
  • 您可以将您的操作函数声明为接收 sender作为 UIButton ,避免了垂头丧气的需要。
  • 您可以使用 .toggle()切换 bool 值
  • 您无需调用synchronize() .

  • 我会将图像设置重构为自己的函数并使用 didSet处理程序调用它并在值更改时保存 bool 值。您还需要从 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)
    }
    

    关于ios - 问题在 NSUserDefaults 中存储 "Favourite"按钮状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62314861/

    相关文章:

    IOS取消本地通知

    ios - 如何使用回调将错误从网络类传递到 ViewController

    ios - swift "timer"变量

    ios - 如何增加当前位置蓝色圆圈的比例

    arrays - Swift 3 使用 UserDefaults 保存数组

    xcode - 使用 NSuserdefaults 在 Swift 和 Sprite Kit 中设置 HighScore

    ios - 如何将 NSUserdefault 的值放入 URL

    iphone - 无法验证包 : 727047181. itmsp

    iOS 10 GM 嵌入的 UITableView 和 UICollectionView contentSize 错误且滚动指示器未显示

    ios - 忽略 NSArray 上的对象 - 内存管理器