2014-12-24 3 views
3

할 일 목록 응용 프로그램을 만들고 있지만 목록에서 항목을 삭제하려고하면 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() 


     } 
    } 
} 

중단 점을 말 EXC_BAD_INSTRUCTION

뿐만 아니라 eventList.removeAtIndex(indexPath.row)에서 생성되고있다.

답변

6

데이터 소스 배열에서 항목을 제거하는 것만으로는 충분하지 않습니다. 또한 행이 삭제됩니다 테이블 뷰 얘기를 해 :

if editingStyle == .Delete { 

    eventList.removeAtIndex(indexPath.row) 
    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 

    // ... 
} 

그렇지 않으면 테이블 뷰 범위 부족 오류를 일으키는 행의 원래 수에 대한 데이터 소스의 메소드를 호출 할 것이다.

또는 데이터 소스를 수정할 때 tableView.reloadData()을 호출 할 수 있지만 위의 메서드 은 더 멋진 애니메이션을 제공합니다.

1

이것은 eventList 범위를 초과하는 색인 ​​indexPath.row에 액세스하려고한다는 것을 의미합니다. 이 문제를 해결하려면 다음을 시도하십시오.

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() 
    } 
} 
관련 문제