好的,所以问题实际上发生一旦代码位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
它们提供了一个位置(注释墙),您应该在那里调试这类问题。
不确定OP是否曾经弄清楚这一点,但我有一个类似的问题,并意识到我从另一个应用程序的AppDelegate
复制的代码是使用该应用程序的项目名称,我忘记改变这一行:let modelURL = NSBundle.mainBundle().URLForResource("CoreData", withExtension: "momd")
使用"CoreData"而不是"测试"它从另一个项目。