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



我是一名新开发人员,正在Swift中制作一个待办事项列表应用程序。我能够弄清楚如何在单击时更改UIButton(复选框)的状态。目前,我正试图找出如何在退出应用程序或切换视图并返回时保存该状态。我使用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)

我在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
        }
    }
}
}

我认为您可以在变量isChecked更改时用NSUserDefaults保存UIButton的状态。类似这样的东西:

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

}

现在,当您的应用程序启动时,您可以使用以下信息检查UIButton的最后状态:

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

更新

我用你的Qbutton课做了一个例子。我希望这能帮助你:

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

现在,在UIViewController中,我创建了一个Qbutton,在将其添加到UIViewController视图之前,我读取了变量"isBtnChecked"的最后状态。

来自官方文件:

如果布尔值与用户默认值中的defaultName相关联,则返回该值。否则,返回NO。

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

更新2

以下是使用UIButton 的选定属性的示例

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

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

我希望这真的能帮助到你!

我觉得你想得太多了,把它弄得很复杂。因为这只是一个简单的按钮,所以最简单的方法是通过IBAction设置bool。如果我在你的问题中遗漏了什么,请告诉我。

在Objective-C中是这样的。。

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

在Swift中,我不流利,但有点像。。

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

最新更新