2016-07-11 9 views
1

Warum erhalte ich folgende Fehlermeldung bekommen*** Beenden app aufgrund nicht abgefangene Ausnahme 'NSRangeException', Grund: ‚*** - [__ NSArray0 objectAtIndex:]: Index 0 über Grenzen für leere NSArray

* Beenden app aufgrund nicht abgefangene Ausnahme 'NSRangeException', Grund: '* - [__ NSArray0 objectAtIndex:]: Index 0 über Grenzen für leere NSArray' *** Erster Wurf Call-Stack: (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: mit abgefangene Ausnahme vom Typ NSException Abschluss

der Code für meinen ersten Viewcontroller unter

gegeben
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() 



} 
} 
+0

Beenden App aufgrund der nicht abgefangenen Ausnahme 'NSRangeException', Grund .... liegt daran, dass Sie leere Array haben und Sie versuchen, auf das Objekt von leeren Array zuzugreifen. – Bhoomi

+0

Xcode sagt Ihnen genau, was passiert. Sie erhalten nicht immer so detaillierte Informationen über den Grund eines Absturzes. Überprüfen Sie Ihre Arrays. Setup Breakpoints, Watch Array Größe, etc. –

Antwort

2

es, weil die abgestürzt Array self.entries enthält kein Objekt. Sie sollten dies überprüfen, bevor Sie die Tabelle aktualisieren.

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

Es ist besser, '! Self.entries.isEmpty' zu verwenden, anstatt eine Zählung der Elemente zu erzwingen. – Moritz

+0

@EricD - tanx buddy, es ist auch eine gute Wahl –

+0

Sie können überprüfen, Wetter Array ist leer oder nicht auf verschiedene Arten, Hilfe finden Sie unter diesem Link http://StackOverflow.com/Questions/27588964/check-if-optional-array- is-empty –

Verwandte Themen