【问题标题】:Retrieving Core Data With Swift使用 Swift 检索核心数据
【发布时间】:2014-11-02 22:10:35
【问题描述】:

问题

我是 IOS 开发的新手,一直在努力使用 Core Data。我正在尝试使用开关创建设置页面。我需要记住这个开关是打开还是关闭。我创建了一个核心数据应用程序,并设法弄清楚如何将开关的值保存到属性中。下面的代码做到了这一点,我只是不知道如何将开关的保存值恢复为打开或关闭。我该怎么做?谢谢!

核心数据图片

代码:

import UIKit
import CoreData
class preferencesStuff: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!

    var request = NSFetchRequest(entityName: "Settings")
    request.returnsObjectsAsFaults = false;
    var results:NSArray = context.executeFetchRequest(request, error: nil)!

    if(results.count > 0){
        if results[results.count-1] as NSObject == 1 {
            println("ON")
        }


    }else{
        println("NO RESULTS")
    }

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
@IBOutlet weak var fractSwitchValue: UISwitch!

@IBAction func fractSwitch(sender: AnyObject) {
    if fractSwitchValue.on == true {
        var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
        var context:NSManagedObjectContext = appDel.managedObjectContext!

        var newSetting = NSEntityDescription.insertNewObjectForEntityForName("Settings", inManagedObjectContext: context) as NSManagedObject
        newSetting.setValue(true, forKey: "fractionOnOff")

        context.save(nil)
        //println(newSetting)


    }
    else {
        var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
        var context:NSManagedObjectContext = appDel.managedObjectContext!

        var newSetting = NSEntityDescription.insertNewObjectForEntityForName("Settings", inManagedObjectContext: context) as NSManagedObject
        newSetting.setValue(false, forKey: "fractionOnOff")

        context.save(nil)
        //println(newSetting)

    }
}

}

【问题讨论】:

    标签: ios core-data swift


    【解决方案1】:

    我刚刚用 CoreData 做了你的例子。我只是碰巧存储了一个 NSString 而不是 Bool。它没有经过优化,但它应该能让你继续前进。

    import UIKit
    import CoreData
    
    class ViewController: UIViewController {
    
        var state: NSString = ""
    
        @IBOutlet weak var fractSwitchValue: UISwitch!
    
        @IBAction func fractSwitch(sender: AnyObject) {
            if fractSwitchValue.on == true {
                state = "On"
                save(state)
            }
            else {
                state = "Off"
                save(state)
            }
        }
    
        override func viewWillAppear(animated: Bool) {
            super.viewWillAppear(animated)
    
            var appDel = UIApplication.sharedApplication().delegate as AppDelegate
            var context = appDel.managedObjectContext!
            var request = NSFetchRequest(entityName: "Settings")
            var error: NSError?
            var results = context.executeFetchRequest(request, error: &error) as [NSManagedObject]?
    
            if let fetchedResults = results {
                state = fetchedResults[fetchedResults.count - 1].valueForKey("fractionOnOff") as String!
            } else {
                println("Could not fetch \(error), \(error!.userInfo)")
            }
    
            if state == "On" {
                fractSwitchValue.setOn(true, animated: true)
            }  else {
                fractSwitchValue.setOn(false, animated: true)
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        func save(string: NSString) {
            let appDel = UIApplication.sharedApplication().delegate as AppDelegate
            let context = appDel.managedObjectContext!
            let entity =  NSEntityDescription.entityForName("Settings", inManagedObjectContext: context)
            let setting = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: context)
            setting.setValue(string, forKey: "fractionOnOff")
            println(string)
            var error: NSError?
            if !context.save(&error) {
                println("Could not save \(error), \(error?.userInfo)")
            }
        }
    }
    

    【讨论】:

    • 这在稍微摆弄之后解决了问题,让我把值拿回来。非常感谢!
    【解决方案2】:

    我会在这种情况下使用NSUserDefaults。在存储用户偏好时,它比 Core Data 更容易使用。例如,您可以使用

    来存储属性
    NSUserDefaults.standardUserDefaults().setBool(value, forKey: "fractionPreference")
    

    并使用检索它

    let value = NSUserDefaults.standardUserDefaults().boolForKey("fractionPreference")
    

    【讨论】:

    • 我支持这个议案。避免使用核心数据并使用 NSUserDefaults 或升级到完整的 NSCoding。
    • 确保在尝试使用之前有条件地解开value
    • @Abizern '有条件地展开'是什么意思
    • @Computer_whiz123 阅读Optional Binding in the Swift Language Guide上的部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多