无法解包 Optional.在 Swift 中使用 CoreData 时无



好的,所以问题实际上发生一旦代码位var context: 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

一旦按下按钮,应用程序将崩溃 ^

代码错误信息为fatal error cannot unwrap可选。没有一个

    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
}

}

看看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

正如你所看到的,它是由一个Optional.

可能出错的地方在这里:

  _managedObjectContext = NSManagedObjectContext()
  _managedObjectContext!.persistentStoreCoordinator = coordinator

如果NSManagedObjectContext()返回一个nil,那么后面的_managedObjectContext将为nil,您将在打开return _managedObjectContext!

的行中得到这个崩溃

要调试这个问题,请深入堆栈,很可能没有初始化对象模型或持久化存储,因此返回nil给您。

编辑:在var persistentStoreCoordinator: NSPersistentStoreCoordinator

getter的定义中

它们提供了一个位置(注释墙),您应该在那里调试这类问题。

不确定OP是否曾经弄清楚这一点,但我有一个类似的问题,并意识到我从另一个应用程序的AppDelegate复制的代码是使用该应用程序的项目名称,我忘记改变这一行:let modelURL = NSBundle.mainBundle().URLForResource("CoreData", withExtension: "momd")使用"CoreData"而不是"测试"它从另一个项目。

最新更新