迅捷的致命错误:数组索引超出范围
我正在做一个待办事项列表的应用程序,但当我尝试从我的列表中删除的东西,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() } }