【问题标题】:Save Button Status保存按钮状态
【发布时间】:2016-12-04 19:08:21
【问题描述】:

我开始为我的项目创建一个最喜欢的button,我需要一些帮助...

我已经创建了一个button,并且已经将它编程为在tapped 时切换image:

 override func viewDidLoad() {
        super.viewDidLoad()

        //create a new button
        let Favoritebutton: UIButton = UIButton(type: UIButtonType.Custom)
        //set image for button
        Favoritebutton.setImage(UIImage(named: "EmptyHeart.png"), forState: UIControlState.Normal)
        Favoritebutton.setImage(UIImage(named: "FilledHeart.png"), forState: UIControlState.Selected)
        //add function for button
        Favoritebutton.addTarget(self, action: #selector(self.button(_:)), forControlEvents: .TouchUpInside)
        //set frame
        Favoritebutton.frame = CGRectMake(90, 90, 35, 35)

        let barButton = UIBarButtonItem(customView: Favoritebutton)
        //assign button to navigationbar
        self.navigationItem.rightBarButtonItem = barButton

    }


    @IBAction func button(sender: UIButton) {
        sender.selected = !sender.selected;
    }

它工作得很好,但到目前为止,如果我退出应用程序,button 不会保存状态,如果它的selected 或不是。我听说你可以通过NSUserDefault 实现这一点,但我不知道如何实现这一点,所以我很想得到一些帮助:)

我正在使用 Swift 2.3 和 Xcode 8。

谢谢。

【问题讨论】:

  • 您的问题并非针对 iPhone 或 Xcode。请不要添加不相关的标签。您应该阅读这些标签的说明以了解何时正确使用它们。

标签: ios swift button


【解决方案1】:

这很容易。在 UserDefaults 中,您可以毫无问题地存储布尔值。

在 viewDidLoad 中,您可以像这样检查密钥的值。

let defaults = UserDefaults.standard

let buttonIsSelected = defaults.bool(forKey: "keyForIsButtonSelected") // If no value exists for this key then false is returned

button.selected = buttonIsSelected

在你的按钮功能里面记得保存你的状态。

sender.selected = !sender.selected

let defaults = UserDefaults.standard

defaults.set(sender.selected, forKey: "keyForIsButtonSelected")

defaults.synchronize() // Save your defaults, can also move this part of code to applicationWillTerminate

对于 Swift 2.3 使用这个。

let defaults = NSUserDefaults.standardUserDefaults()

let buttonIsSelected = defaults.boolForKey("keyForIsButtonSelected") // If no value exists for this key then false is returned

button.selected = buttonIsSelected

内部按钮功能。

sender.selected = !sender.selected

let defaults = NSUserDefaults.standardUserDefaults()

defaults.setBool(sender.selected, forKey: "keyForIsButtonSelected")

defaults.synchronize() // Save your defaults, can also move this part of code to applicationWillTerminate

【讨论】:

  • 不要无谓地拨打synchronize。
  • 可以在 applicationWillTerminate 上调用,但是如果用户在更改按钮默认值后退出应用程序(并且代码中没有同步),则不会更新(保存)。
  • 我遇到了这个错误:Use of unresolved identifier 'UserDefaults'顺便说一下@Adamsor,我使用的是Swift 2.3
  • @Adamsor 仅在applicationDidEnterBackground 中调用synchronize。就是这样。其他任何地方都不需要。
  • @Newbie Questions Ohh 然后使用 'NSUserDefaults.standardUserDefaults().boolForKey("keyForIsButtonSelected")' 和 'NSUserDefaults.standardUserDefaults().setBool(button.selected, forKey: "keyForIsButtonSelected")'。他们只是重命名了类(删除了 NS)并更改了一些方法。
【解决方案2】:

对于 swift 3,它将是下一个:

//save value
UserDefaults.standard.set(selected, forKey: "lButtonSelected")
//then on next launch restore it
let selected = UserDefaults.standard.value(forKey: "lButtonSelected")

【讨论】:

    【解决方案3】:

    保存NSUserDefaults中的值:

    UserDefaults.standard.set(selected, forKey: "buttonStatus")
    UserDefaults.standard.synchronize()
    

    并从NSUserDefaults检索值:

    let buttonStatus = UserDefaults.standard.value(forKey: "buttonStatus")
    

    【讨论】:

    • 不要无谓地拨打synchronize。
    • @rmaddy true,他可以在应用进入后台时调用同步
    • 这是唯一一次任何人都应该致电synchronize。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多