简体   繁体   English

UIButton的保存状态(复选框)-Swift

[英]Saving state of UIButton (checkbox) - Swift

I'm a new developer and I'm making a to-do list app in Swift. 我是一名新开发人员,正在使用Swift开发待办事项清单应用程序。 I was able to figure out how to change the state of the UIButton (checkbox) on clicking. 我能够弄清楚如何在单击时更改UIButton (复选框)的状态。 At the moment I'm trying to figure out how to save that state for when I exit the app or switch views and return. 目前,我正试图弄清楚如何在退出应用程序或切换视图并返回时保存该状态。 I was able to successfully save the text (to-do list tasks) by using NSUserDefaults and have also experimented with it on my buttons but cannot figure out how to get it to work. 我能够通过使用NSUserDefaults成功保存文本(待办事项列表任务),并且还在按钮上进行了尝试,但无法弄清楚如何使其正常工作。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var myButton: Qbutton!

override func viewDidLoad() {
    super.viewDidLoad()

    var isChecked = NSUserDefaults.standardUserDefaults().boolForKey("isBtnChecked") // here we obtain the last state of the button
    myButton.isChecked = isChecked
    self.view.addSubview(myButton)

I have the UIButton in a subclass of QButton . 我在QButton的子类中有UIButton

class Qbutton: UIButton {

    var isSelected: Bool = defaults.boolForKey("isButtonChecked")

    // Images
    let selectedImage = UIImage(named: "Selected")
    let unselectedImage = UIImage(named: "Unselected")


    //Bool Property
    var isChecked:Bool = false{
        didSet{
            if isChecked == true{
                self.setImage(selectedImage, forState: UIControlState.Normal)
            }else{
                self.setImage(unselectedImage, forState: UIControlState.Normal)
            }
            defaults.setObject(isChecked, forKey: "isButtonChecked")
        }
    }

    override init(frame: CGRect){
    super.init(frame:frame)
    self.layer.masksToBounds = true
    self.setImage(unselectedImage, forState: UIControlState.Normal)

    self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
    self.isChecked = false
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

func buttonClicked(sender: UIButton) {
    if(sender == self){
        if isChecked == true{
            isChecked = false
        }else{
            isChecked = true
        }
    }
}
}

well i think you can save the state of the UIButton with the NSUserDefaults just when the variable isChecked is changed. 好吧,我认为您可以在变量isChecked更改时使用NSUserDefaults保存UIButton的状态。 Something like this: 像这样:

var isChecked:Bool = false{
    didSet{
        if isChecked {
            self.setImage(selectedImage, forState: UIControlState.Normal)
        }else{
            self.setImage(unselectedImage, forState: UIControlState.Normal)
        }
        NSUserDefaults.standardUserDefaults().setObject(isChecked, forKey: "isBtnChecked")
        // this method is automatically invoked at periodic intervals, but
        //if you cannot wait for the automatic synchronization you can invoke it
        NSUserDefaults.standardUserDefaults().synchronize() 
    }


}

Now when your app is launched you can check the last state of the UIButton with this: 现在,当您启动应用程序时,您可以使用以下命令检查UIButton的最后状态:

var isSelected: Bool = NSUserDefaults.standardUserDefaults().boolForKey("isBtnChecked")

UPDATE UPDATE

I made an example using your Qbutton class. 我使用您的Qbutton类进行了示例。 I hope this can help you: 我希望这可以帮助您:

import Foundation
import UIKit

class Qbutton: UIButton {

    // Images
    let selectedImage = UIImage(named: "Selected")
    let unselectedImage = UIImage(named: "Unselected")

    //Bool Property
    var isChecked:Bool = false{
        didSet{
            if isChecked {
                self.setImage(selectedImage, forState: UIControlState.Normal)
            }else{
                self.setImage(unselectedImage, forState: UIControlState.Normal)
            }
            NSUserDefaults.standardUserDefaults().setObject(isChecked, forKey: "isBtnChecked")
            // this method is automatically invoked at periodic intervals, but
            //if you cannot wait for the automatic synchronization you can invoke it
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }

    override init(frame: CGRect){
        super.init(frame:frame)
        self.layer.masksToBounds = true
        self.setImage(unselectedImage, forState: UIControlState.Normal)

        self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
        self.isChecked = false
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func buttonClicked(sender: UIButton) {
        if(sender == self){
            if isChecked == true{
                isChecked = false
                self.setImage(unselectedImage, forState: UIControlState.Normal)
            }else{
                isChecked = true
                self.setImage(selectedImage, forState: UIControlState.Normal)
            }
        }
    }
}

Now in the UIViewController i create a Qbutton and before i add it to the UIViewController view i read the last state of the variable "isBtnChecked". 现在,在UIViewController创建一个Qbutton ,然后将其添加到UIViewController视图中,然后读取变量“ isBtnChecked”的最后状态。

From the official docs : 官方文档

If a boolean value is associated with defaultName in the user defaults, that value is returned. 如果布尔值与用户默认值中的defaultName关联,则返回该值。 Otherwise, NO is returned. 否则,返回否。

import UIKit
class ViewController: UIViewController {
    var myButton: Qbutton!

    override func viewDidLoad() {
        super.viewDidLoad()

        myButton = Qbutton(frame: CGRectMake(100,100,50 ,50));
        var isChecked = NSUserDefaults.standardUserDefaults().boolForKey("isBtnChecked") // here we obtain the last state of the button
        myButton.isChecked = isChecked // we set the value
        self.view.addSubview(myButton)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }
}

UPDATE 2 更新2

Here is an example using the selected property of UIButton 这是一个使用UIButton的selected属性的示例

import Foundation
import UIKit

class Qbutton: UIButton {

    // Images
    let selectedImage = UIImage(named: "Selected")
    let unselectedImage = UIImage(named: "Unselected")


    //Bool Property
    override var selected: Bool{
        didSet{
            if selected {
                self.setImage(selectedImage, forState: UIControlState.Normal)
            }else{
                self.setImage(unselectedImage, forState: UIControlState.Normal)
            }
            NSUserDefaults.standardUserDefaults().setObject(selected, forKey: "isBtnChecked")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }

    override init(frame: CGRect){
        super.init(frame:frame)
        self.layer.masksToBounds = true
        self.setImage(unselectedImage, forState: UIControlState.Normal)

        self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
   }

    func buttonClicked(sender: UIButton) {
        self.selected = !self.selected
    }
}

And the UIViewController : UIViewController

import UIKit
class ViewController: UIViewController {
    var myButton: Qbutton!

    override func viewDidLoad() {
        super.viewDidLoad()

        myButton = Qbutton(frame: CGRectMake(100,100,50 ,50));
        myButton.selected = NSUserDefaults.standardUserDefaults().boolForKey("isBtnChecked") // here we obtain the last state of the button
        self.view.addSubview(myButton)

    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }
}

I hope this really can help you! 希望这对您有所帮助!

I think you are completely over-thinking it and making it complicated. 我认为您完全想得太多,并使它变得复杂。 Since it's just a simple button the easiest way to do it is set a bool through an IBAction . 因为它只是一个简单的按钮,所以最简单的方法是通过IBAction设置布尔值。 Let me know if I'm missing something from your question though. 让我知道我是否仍然错过了您的问题。

In Objective-C it would be something like this.. 在Objective-C中,将是这样。

{
    BOOL _isStateEnabled;
}

-(IBAction)clickedButton: (id)sender {
    _isStateEnabled = !_isStateEnabled;
}

In Swift I'm not fluent but, something like this.. 在Swift中,我不太熟练,但是,像这样。

{
    let _isStateEnabled as boolean;
}

func buttonClicked(sender: UIButton) {
    _isStateEnabled = !_isStateEnabled;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM