***因未捕获的异常终止应用程序' NSRangeException',原因:' *** - [__ NSArray0 objectAtIndex:]:索引0超出空NSArray

时间:2016-07-11 10:16:47

标签: ios swift core-data

为什么我一直收到以下错误

  

*由于未捕获的异常终止应用' NSRangeException',原因:' * - [__ NSArray0 objectAtIndex:]:索引0超出空NSArray的范围'   ***第一次抛出调用堆栈:   (0x183702db0 0x182d67f80 0x1836799ac 0x18d48f6d4 0x10003999c 0x100039b04 0x188860c40 0x1888790d0 0x188a13e5c 0x18891fe40 0x18891fb1c 0x18891fa84 0x194f41fd0 0x18885c1e4 0x1861ee994 0x1861e95d0 0x1861e9490 0x1861e8ac0 0x1861e8820 0x18885eff4 0x1836b909c 0x1836b8b30 0x1836b6830 0x1835e0c50 0x184ec8088 0x1888ca088 0x10003fd7c 0x18317e8b8)   libc ++ abi.dylib:以NSException类型的未捕获异常终止

我的初始viewcontroller的代码如下所示

import UIKit
import CoreData
class NotesListTableViewController: UITableViewController  {
var managedObjectContext : NSManagedObjectContext!
var entries: [NSManagedObject]!

override func viewDidLoad()
{
    super.viewDidLoad()


    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    managedObjectContext = appDelegate.managedObjectContext
    //self.fetchEntries()

          // makes the searchbar stay in the current screen and not spill into the next screen
//definesPresentationContext = true

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}

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

// MARK: - Table view data source



override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return self.entries.count


}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int
{
    return 1
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCellWithIdentifier("NotesCell", forIndexPath: indexPath)

    // Configure the cell...
        let entry1 = entries[indexPath.row]
        cell.textLabel?.text = entry1.valueForKey("entry_body") as? String


        let imageData2 = entry1.valueForKey("entry_image") as? NSData

        if let imageData2 = imageData2
        {
            let myimage = UIImage(data:imageData2,scale:1.0)
            cell.imageView?.image = myimage
        }





    return cell

}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
    if segue.identifier! == "showNote"
    {
        let detailDisplay = segue.destinationViewController as! DetailDisplayViewController
        let selectedIndexPath = tableView.indexPathForSelectedRow!
        let entry = entries[selectedIndexPath.row]
        detailDisplay.entry = entry
    }
}
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
{
    let entry1 = self.entries[indexPath.row]
    self.managedObjectContext.deleteObject(entry1)
    self.entries.removeAtIndex(indexPath.row)
    self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
    do
    {
        try managedObjectContext.save()
    } catch  {
        print ("could not save the new entry ")
    }


}
override func viewWillAppear(animated: Bool)
{
    super.viewWillAppear(animated)
    self.tabBarController?.tabBar.hidden = false

    self.fetchEntries()

}

func fetchEntries()
{
    let fetchRequest = NSFetchRequest(entityName:"Entry")
    do {
        let entryObjects = try managedObjectContext.executeFetchRequest(fetchRequest)
        self.entries = entryObjects as! [NSManagedObject]
    }catch let error as NSError
    {
        print ("could not save the new entry \(error.description) ")
    }
    tableView.reloadData()



}
}

2 个答案:

答案 0 :(得分:2)

它崩溃了,因为数组self.entries不包含任何对象。你应该在刷新表之前检查它。

func fetchEntries()
{
    let fetchRequest = NSFetchRequest(entityName:"Entry")
    do {
        let entryObjects = try managedObjectContext.executeFetchRequest(fetchRequest)
        self.entries = entryObjects as! [NSManagedObject]
    }catch let error as NSError
    {
        print ("could not save the new entry \(error.description) ")
    }

    if !self.entries.isEmpty  // if your array is not empty refresh the tableview
    {
        tableView.reloadData()
    }

}

答案 1 :(得分:1)

您是否尝试过:

  1. 点击表格视图
  2. 转到属性检查器
  3. 将内容从Static Cells更改为Dynamic Prototypes

enter image description here

相关问题