Ios 致命错误:在展开可选值错误时意外发现nil
在查看了所有其他堆栈溢出线程之后,我得到了我在标题中写的错误,但没有一个真正解释问题的来源 当我启动应用程序时,它会立即崩溃并以红色突出显示这一行:Ios 致命错误:在展开可选值错误时意外发现nil,ios,swift,Ios,Swift,在查看了所有其他堆栈溢出线程之后,我得到了我在标题中写的错误,但没有一个真正解释问题的来源 当我启动应用程序时,它会立即崩溃并以红色突出显示这一行: let modelURL = NSBundle.mainBundle().URLForResource("HitList", withExtension: "momd")! 应用程序启动的“我的主视图”控制器包含以下代码: import UIKit import CoreData class ViewController: UIViewCont
let modelURL = NSBundle.mainBundle().URLForResource("HitList", withExtension: "momd")!
应用程序启动的“我的主视图”控制器包含以下代码:
import UIKit
import CoreData
class ViewController: UIViewController, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var subjects = [NSManagedObject]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.registerClass(UITableViewCell.self,
forCellReuseIdentifier: "Cell")
}
func tableView(tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return subjects.count
}
func tableView(tableView: UITableView,
cellForRowAtIndexPath
indexPath: NSIndexPath) -> UITableViewCell {
let cell =
tableView.dequeueReusableCellWithIdentifier("Cell")
let check = subjects[indexPath.row]
cell!.textLabel!.text =
check.valueForKey("name") as? String
return cell!
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func addName(sender: AnyObject) {
let alert = UIAlertController(title: "New Subject", message: "Add a new Subject", preferredStyle: .Alert)
let saveAction = UIAlertAction(title: "Save",
style: .Default,
handler: { (action:UIAlertAction) -> Void in
let textField = alert.textFields!.first
self.saveName(textField!.text!)
self.tableView.reloadData()
})
let cancelAction = UIAlertAction(title: "Cancel",
style: .Default) { (action: UIAlertAction) -> Void in
}
alert.addTextFieldWithConfigurationHandler {
(textField: UITextField) -> Void in
}
alert.addAction(saveAction)
alert.addAction(cancelAction)
presentViewController(alert,
animated: true,
completion: nil)
}
func saveName(name: String) {
let appDelegate =
UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let entity = NSEntityDescription.entityForName("Subjects",
inManagedObjectContext:managedContext)
let check = NSManagedObject(entity: entity!,
insertIntoManagedObjectContext: managedContext)
check.setValue(name, forKey: "name")
do {
try managedContext.save()
subjects.append(check)
} catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
}
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
let appDelegate =
UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "Subjects")
do {
let results =
try managedContext.executeFetchRequest(fetchRequest)
subjects = results as! [NSManagedObject]
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath) {
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "ShowAssesment") {
let indexPath = tableView.indexPathForCell((sender as? UITableViewCell)!)
let listVC = segue.destinationViewController as? AssesmentViewController
let subject = subjects[indexPath!.row]
listVC?.assesments = ["Death"]
}
}
}
当
让modelURL=NSBundle.mainBundle().URLForResource(“HitList”,扩展名为“mom”)时执行代码>,未找到文件命中列表,结果为零。您不能打开零。根据Apple的方法:
返回由指定名称和扩展名标识并驻留在给定捆绑包目录中的资源文件的文件URL
并返回:
资源文件的文件URL或nil
(如果找不到该文件)。如果bundlePath
参数指定的bundle不存在或不是可读目录,则此方法还返回nil
您需要在打开它之前进行检查,记住每次使用
operator打开一个可选的绑定。如果您对编译器说变量总是有一个值,您可以使用可选绑定修复它,如下所示:
if let modelURL = NSBundle.mainBundle().URLForResource("HitList", withExtension: "momd") {
// do whatever you what with the value
}
else {
// the value is nil
}
或者在Swift 2.0中使用新的guard
语句,如下所示:
guard let let modelURL = NSBundle.mainBundle().URLForResource("HitList", withExtension: "momd") else {
// the value is nil
return
}
我希望这对您有所帮助。您正在尝试展开一个行中不存在的值
let modelURL = NSBundle.mainBundle().URLForResource("HitList", withExtension: "momd")!
找到您试图获取的文件,并确保该文件存在且名为HitList.momd。而是这样做
var modelURL = NSBundle.mainBundle().URLForResource("HitList", withExtension: "momd")
以防文件不存在,你的应用程序不会崩溃 谢谢,这已经奏效了。John Doe的不起作用,因为它仍然给出了错误消息,但在本例中将URLForResource更改为xcdatamodeld名称。谢谢,这已经起作用了,我能够更改它,我遇到的另一个问题是,当我单击一个segue时,它不会转移到另一个表视图,即使我已经使用id showassement创建了一个show segue