【问题标题】:Saving a button image's state swift快速保存按钮图像的状态
【发布时间】:2015-12-08 02:01:02
【问题描述】:

当用户按下按钮时,图像会变为开启状态。当用户离开视图控制器时,我需要它记住下次他们访问此 VC 时按钮已设置为图像。我尝试了 NSUser 默认值无济于事。有人可以帮忙吗?

在按钮动作中:

  buttonPressed = !buttonPressed

    let defaults = NSUserDefaults.standardUserDefaults()


    if buttonPressed == true {

        let followedObjectId = userToShowDetail?["name"] as? String

        isFollowing[followedObjectId!] = true

        sender.setImage(UIImage(named: "fave_on@2x.png"), forState: UIControlState.Normal)
        print("follow")

        let following = PFObject(className: "Followers")
        following["following"] = userToShowDetail?["name"] as? String
        following["follower"] = PFUser.currentUser()?.objectId
        favLabel.text = "Favourite Jammer"

        following.saveInBackground()
        defaults.setBool(true, forKey: "SwitchState")

    } else {

        if buttonPressed != true {
            let followedObjectId = userToShowDetail?["name"] as? String

            isFollowing[followedObjectId!] = false
            print("notFollow")
            sender.setImage(UIImage(named: "fave_off@2x.png"), forState: UIControlState.Normal)

            favLabel.text = "Add to favourites?"

            defaults.setBool(false, forKey: "SwitchState")

在视图中确实加载了:

  // save switch state:
    let defaults = NSUserDefaults.standardUserDefaults()
    if (defaults.objectForKey("SwitchState") != nil) {
        buttonPressed = defaults.boolForKey("SwitchState")
    }

【问题讨论】:

    标签: swift uibutton swift2 nsuserdefaults state


    【解决方案1】:

    在下面尝试我的解决方案。每次单击该按钮时,它都会更改打开和关闭状态。如果您离开视图控制器,它将保存状态。让我知道这是否对您有帮助。

    import UIKit
    
    class ViewController: UIViewController{
    
        // MARK: Properties
    
        @IBOutlet weak var imgTest: UIImageView!
    
        let defaults = NSUserDefaults.standardUserDefaults()
        var setImageStatus: String = "off" {
            willSet {
                if newValue == "on" {
                    imgTest.image = UIImage(named: "imgOn.png")
                } else {
                    imgTest.image = UIImage(named: "imgOff.png")
                }
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            if let imgStatus = defaults.stringForKey("imgStatus")
            {
                setImageStatus = imgStatus
            } else {
                setImageStatus = "off"
            }
    
        }
    
        @IBAction func btnSave(sender: UIButton) {
    
            let stat = setImageStatus == "on" ? "off" : "on"
            setImageStatus = stat
            defaults.setObject(stat, forKey: "imgStatus")
    
        }
    }
    

    【讨论】:

    • 当我尝试打开代码所在的VC时,它在setImageStatus = status ???
    • Jamster 是经过优化编译的 - 步进可能会出现异常;变量可能不可用。 (lldb)
    • (Jamster 是应用的名称)
    • 它在我的工作正常...你能显示整个错误...一切..我会跟踪问题
    【解决方案2】:

    你可以简单地将这样的东西存储在你的AppDelegate

    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate{
    
        var myButtonSwitchState: Bool = false
    
    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            //your code...
        }    
    
        //the rest of your code...
    
    }
    

    然后,在您的视图控制器中,您可以通过将 UIApplication.sharedApplication().delegate 转换为 AppDelegate 来获取您的应用委托

    var appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    

    然后,您可以在应用委托中简单地获取和设置布尔值

    func getSwitchState() -> Bool{
        return appDelegate.myButtonSwitchState
    }
    
    func setSwitchState(value: Bool){
        appDelegate.myButtonSwitchState = value
    }
    

    如果您想在用户退出应用(将其从正在运行的应用中删除)后存储此状态,您可以使用 NSUserDefaults 并简单地使用它

    func getSwitchState() -> Bool{
        return NSUserDefaults.standardUserDefaults().boolForKey("buttonStatus")
    }
    
    func setSwitchState(value: Bool){
        NSUserDefaults.standardUserDefaults().setObject(value, forKey: "buttonStatus")
        NSUserDefaults.standardUserDefaults().synchronize()
    }
    

    【讨论】:

    • 嗨,感谢您的意见,但我得到了第一个答案。
    • @Grace 好吧,我很高兴你能成功,但你应该用布尔值 true 和 false 替换字符串“on”和“off”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2020-03-16
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多