迅捷的致命错误:数组索引超出范围

我正在做一个待办事项列表的应用程序,但当我尝试从我的列表中删除的东西,Xcode给我一个错误,说:“致命的错误:数组索引超出范围”。 有人能告诉我什么我做错了我的数组,这是造成这种情况发生?

import UIKit class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 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. } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return eventList.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell") cell.textLabel?.text = eventList[indexPath.row] return cell } override func viewWillAppear(animated: Bool) { if var storedEventList : AnyObject = NSUserDefaults.standardUserDefaults().objectForKey("EventList") { eventList = [] for var i = 0; i < storedEventList.count; ++i { eventList.append(storedEventList[i] as NSString) } } } func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if(editingStyle == UITableViewCellEditingStyle.Delete) { eventList.removeAtIndex(indexPath.row) NSUserDefaults.standardUserDefaults().setObject(eventList, forKey: "EventList") NSUserDefaults.standardUserDefaults().synchronize() } } } 

eventList.removeAtIndex(indexPath.row)中也创build了一个断点EXC_BAD_INSTRUCTION。

从数据源数组中删除项目是不够的。 您还必须告诉表视图该行已被删除:

 if editingStyle == .Delete { eventList.removeAtIndex(indexPath.row) tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) // ... } 

否则,表视图将调用原始行数的数据源方法,从而导致超出范围的错误。

或者,可以在修改数据源时调用tableView.reloadData() ,但上面的方法提供了更好的animation。

这意味着您正试图访问超过eventList范围的索引eventList 。 要解决这个问题,请尝试:

 func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if(editingStyle == .Delete && indexPath.row < eventList.count) { eventList.removeAtIndex(indexPath.row) tableView.reloadData() NSUserDefaults.standardUserDefaults().setObject(eventList, forKey: "EventList") NSUserDefaults.standardUserDefaults().synchronize() } }