我为我的应用添加了一个3D Touch应用程序快捷方式,但是当点击它时,应用程序崩溃时出现“致命错误:在展开Optional值时意外发现nil”。有些东西是零的,虽然我不知道是什么/为什么我有这个代码在另一个应用程序中工作。我能看到的唯一区别是这个新应用程序使用核心数据。
private func selectTabBarItemForIdentifier(identifier: ShortcutIdentifier) -> Bool {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
var vc = UIViewController()
switch (identifier) {
case .AddItem:
// load AddItem view directly
vc = storyboard.instantiateViewControllerWithIdentifier("AddItemController") as! AddItemController
}
window!.rootViewController?.presentViewController(vc, animated: true, completion: nil)
return true;
}
“窗口!”当然是可选的,虽然这不是我的其他应用程序中的问题,我不相信它是这里的罪魁祸首。同样,我怀疑有关Core Data的内容,但我无法在StackOverflow或其他特定情况下找到任何内容。
我也尝试更改加载的视图,但我仍然得到nil错误。
这是与CoreData相关的代码:
// MARK: - Core Data stack
lazy var applicationDocumentsDirectory: NSURL = {
// The directory the application uses to store the Core Data store file. This code uses a directory named "com.group.TestApp" in the application's documents Application Support directory.
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.count-1]
}()
lazy var managedObjectModel: NSManagedObjectModel = {
// The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
let modelURL = NSBundle.mainBundle().URLForResource("TestApp", withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
// The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
// Create the coordinator and store
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
var failureReason = "There was an error creating or loading the application's saved data."
do {
try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
} catch {
// Report any error we got.
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSUnderlyingErrorKey] = error as NSError
let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
abort()
}
return coordinator
}()
lazy var managedObjectContext: NSManagedObjectContext = {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
let coordinator = self.persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
// MARK: - Core Data Saving support
func saveContext () {
if managedObjectContext.hasChanges {
do {
try managedObjectContext.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nserror = error as NSError
NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
abort()
}
}
}
答案 0 :(得分:1)
好吧,让我们试着解开一个可选的,替换
window!.rootViewController?.presentViewController(vc, animated: true, completion: nil)
使用:
if let aWindow = window {
aWindow.rootViewController?.presentViewController(vc, animated: true, completion: nil)
}