在Swift中使用Core Data时无法解开Optional.None

时间:2014-06-09 16:38:16

标签: core-data swift

好的,一旦代码位var上下文实际发生问题:NSManagedObjectContext = appDel.managedObjectContext运行我评论它确认它是那行,请注意这是我第一次学习iOS编程所以请尝试在答案中尽可能具体,谢谢你:))

import UIKit
import CoreData
class SecondViewController: UIViewController, UITextFieldDelegate {

@IBOutlet var txtName : UITextField
@IBOutlet var txtDesc : UITextField
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!)  {
    self.view.endEditing(true)
}

@IBAction func hitAdd(sender : UIButton) {
    glTask.newTask(txtName.text, desc: txtDesc.text)
    txtName.text = ""
    txtDesc.text = ""
    self.view.endEditing(true)
    self.tabBarController.selectedIndex = 0
    var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
  

就在这里 V

    var context: NSManagedObjectContext = appDel.managedObjectContext
  

按下按钮后会崩溃 ^

     
    

代码错误消息 致命错误无法解包Optional.None

  
    var newTask = NSEntityDescription.insertNewObjectForEntityForName("Tasks", inManagedObjectContext: context) as NSManagedObject
    newTask.setValue("test task", forKey: "myTask")
    newTask.setValue("test Description", forKey: "myDesc")
    context.save(nil)
    //println(newTask)
    println("Task was saved.")

}

// UITextField Delegate
func textFieldShouldReturn(textField: UITextField!) -> Bool {

    textField.resignFirstResponder()
    return true
}

}

2 个答案:

答案 0 :(得分:4)

查看Swift中的核心数据堆栈,managedObjectContext实现如下:

var managedObjectContext: NSManagedObjectContext {
    if !_managedObjectContext {
        let coordinator = self.persistentStoreCoordinator
        if coordinator != nil {
            _managedObjectContext = NSManagedObjectContext()
            _managedObjectContext!.persistentStoreCoordinator = coordinator
        }
    }
    return _managedObjectContext!
}
var _managedObjectContext: NSManagedObjectContext? = nil

正如您所看到的,它由可选项支持。

这可能出错的地方在这里:

  _managedObjectContext = NSManagedObjectContext()
  _managedObjectContext!.persistentStoreCoordinator = coordinator

如果NSManagedObjectContext()返回nil,那么支持_managedObjectContext将为零,您将在打开它的行return _managedObjectContext!

中发生此崩溃

要对此进行调试,请深入挖掘堆栈,最有可能无法初始化对象模型或持久存储,从而将nil返回给您。

修改: 在var persistentStoreCoordinator: NSPersistentStoreCoordinator

的吸气器的定义中

它们提供了一个位置(评论的墙),你应该调试这个确切类型的问题。

答案 1 :(得分:0)

不确定OP是否曾想过这个问题,但我遇到了类似的问题并意识到我从其他应用程序AppDelegate复制的代码正在使用该应用程序的项目名称并且我已经忘记了更改此行:let modelURL = NSBundle.mainBundle().URLForResource("CoreData", withExtension: "momd")使用" CoreData"而不是"测试"它来自另一个项目。