我是一名新开发人员,正在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;
}