[英]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.