致命错误:数组索引超出范围。快速刷新

问题描述:

试了很多次,以找出导致致命错误的原因。但是,仍然无法弄清楚。当我尝试使用pull刷新表时,第一个表(结果表)导致此错误。第二张表(favoriteProductTableView)完美无缺,所以我没有提供任何关于第二张的代码。想知道为什么。感谢您的帮助。致命错误:数组索引超出范围。快速刷新

var followArray = [String]() 
    var resultsNameArray = [String]() 
    var resultsImageFiles = [PFFile?]() 
    var resultsDetailsArray = [String]() 
    var resultsDetailsImageFiles = [PFFile?]() 
    var resultsObjectID = [String]() 
    var resultsTitle = [String]() 
    var personPriceArray = [String]() 
    var personQuantityArray = [String]() 
    var personOrderTypeArray = [String]() 

    var refresher:UIRefreshControl! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     favoriteProductTableView.hidden = true 
     refresher = UIRefreshControl() 
     refresher.tintColor = UIColor.blackColor() 
     refresher.addTarget(self, action: "refresh", forControlEvents: UIControlEvents.ValueChanged) 
     self.resultsTable.addSubview(refresher) 
    } 

    override func viewDidAppear(animated: Bool) { 
     refreshResults() 
    } 

    func refresh(){ 
     refreshResults() 
    } 

    func refreshResults(){ 
     switch(segmentedControl.selectedSegmentIndex){ 
     case 0: 
      followArray.removeAll(keepCapacity: false) 
      resultsNameArray.removeAll(keepCapacity: false) 
      resultsImageFiles.removeAll(keepCapacity: false) 
      resultsDetailsArray.removeAll(keepCapacity: false) 
      resultsDetailsImageFiles.removeAll(keepCapacity: false) 
      resultsObjectID.removeAll(keepCapacity: false) 
      resultsTitle.removeAll(keepCapacity: false) 
      personPriceArray.removeAll(keepCapacity: false) 
      personQuantityArray.removeAll(keepCapacity: false) 
      personOrderTypeArray.removeAll(keepCapacity: false) 

      let followQuery = PFQuery(className: "follow") 
      followQuery.whereKey("user", equalTo: (PFUser.currentUser()!.username)!) 
      followQuery.whereKey("userToFollow", notEqualTo: (PFUser.currentUser()!.username)!) 

      followQuery.findObjectsInBackgroundWithBlock { (objects:[PFObject]?, error: NSError?) -> Void in 
       if error != nil { 
       } 
       for object in objects! { 
        self.followArray.append(object.objectForKey("userToFollow") as! String) 
       } 
       let query = PFQuery(className: "products") 
       query.whereKey("userName", containedIn: self.followArray) 

       query.findObjectsInBackgroundWithBlock { (catchobjects:[PFObject]?, error:NSError?) -> Void in 
        if error != nil { 
        } 
        for catchobject in catchobjects! { 
         if catchobject.objectForKey("selling_price") != nil { 
          self.personPriceArray.append(catchobject.objectForKey("selling_price") as! String) 
          self.personOrderTypeArray.append("Selling") 
         } else { 
          self.personPriceArray.append(catchobject.objectForKey("buying_price") as! String) 
          self.personOrderTypeArray.append("Buying") 
         } 
         self.personQuantityArray.append(catchobject.objectForKey("quantity") as! String) 
         self.resultsNameArray.append(catchobject.objectForKey("unique_username") as! String) 
         self.resultsImageFiles.append(catchobject.objectForKey("profile_picture") as? PFFile) 
         self.resultsDetailsArray.append(catchobject.objectForKey("details") as! String) 
         self.resultsDetailsImageFiles.append(catchobject.objectForKey("detailsImage") as? PFFile) 
         self.resultsTitle.append(catchobject.objectForKey("title") as! String) 
         self.resultsObjectID.append(catchobject.objectId!) 
        } 
        dispatch_async(dispatch_get_main_queue()) { 
         self.resultsTable.reloadData() 
        } 
        self.loadEmptyLabel(self.resultsTable) 
       } 
       self.refresher.endRefreshing() 
      } 
      break 
     case 1: 
      ... 
      break 
     default: 
      break 
     } 
    } 

    func loadEmptyLabel(tableView: UITableView) { 
     let emptyLabel = UILabel(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height)) 
     emptyLabel.textAlignment = NSTextAlignment.Center 
     emptyLabel.textColor = UIColor.blackColor() 
     emptyLabel.text = "No matched result found." 
     tableView.backgroundView = emptyLabel 
     tableView.separatorStyle = UITableViewCellSeparatorStyle.None 
     var resultCount = Int() 
     if tableView == resultsTable { 
      resultCount = resultsNameArray.count 
     } else { 
      resultCount = resultsTitleArray.count 
     } 
     if resultCount == 0 { 
      tableView.reloadData() 
      emptyLabel.hidden = false 
     } else { 
      emptyLabel.hidden = true 
     } 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     var numRow: Int = 0 
     switch(segmentedControl.selectedSegmentIndex){ 
     case 0: 
      numRow = resultsNameArray.count 
      break 
     case 1: 
      numRow = resultsTitleArray.count 
      break 
     default: 
      break 
     } 
     return numRow 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     if tableView == resultsTable { 
      let cell:favoritedTableViewCell = resultsTable.dequeueReusableCellWithIdentifier("Cell") as! favoritedTableViewCell 
      cell.profileLbl.text = self.resultsNameArray[indexPath.row] 
      cell.messageTxt.text = self.resultsDetailsArray[indexPath.row] 
      cell.priceLabel.text = "\(self.personOrderTypeArray[indexPath.row]) \(self.personQuantityArray[indexPath.row]) for $\(self.personPriceArray[indexPath.row])" 
      cell.titleLabel.text = self.resultsTitle[indexPath.row] 
      if resultsImageFiles[indexPath.row] != nil { 
       resultsImageFiles[indexPath.row]!.getDataInBackgroundWithBlock { (imageData:NSData?, error:NSError?) -> Void in 
        if error == nil{ 
         let image = UIImage(data: imageData!) 
         cell.imgView.image = image 
        } 
       } 
      } else { 
       cell.imgView.image = UIImage(named: "Profile Picture") 
      } 
      if resultsDetailsImageFiles[indexPath.row] != nil{ 
       resultsDetailsImageFiles[indexPath.row]?.getDataInBackgroundWithBlock({ (imageData:NSData?, error:NSError?) -> Void in 
        if error == nil{ 
         let image = UIImage(data: imageData!) 
         cell.detailsImg.image = image 
        } 
       }) 
      } else { 
       cell.detailsImg.image = UIImage(named: "Profile Picture") 
      } 
      return cell 
     } else { 
     .... 
     } 
    } 
+0

在挖掘您的代码之前,您能否仅限于相关代码?大多数情况下,您可以通过这种方式找出错误。并告诉我们错误的地方也会很好;) – Eendje

+0

对不起。我试过了,但上面的代码都与导致错误的表格视图有关。我猜代码看起来很乱的原因是因为我在表格视图中使用了10个数组。 –

+0

你至少可以做的是告诉我们错误在哪里;) – Eendje

numberOfRowsInSection函数返回一个基于segmentedControl.selectedSegmentIndex 2米阵列的长度中的一个,而cellForRowAtIndexPath索引正显示基于所述的tableView阵列。这看起来不太合适,尤其是考虑到你的引用``它看起来并没有被填充到任何地方 - 它应该只是resultsTitle

另外,你从后台线程调用self.resultsTable.reloadData()。这是坏的 - 它必须使用主线程调用:

dispatch_async(dispatch_get_main_queue()) { 
    self.resultsTable.reloadData() 
} 

不过,目前还不清楚为什么你有这样的循环中无论是。

+0

刚刚更新了dispatch_async。但是,如果cellForRowAtIndexPath基于所显示的tableView索引数组,所以我不应该使用segmentedControl.selectedSegmentIndex?我应该使用什么?我应该使用类似如果tableView ==结果表{返回resultsNameArray.count} –

+0

resultsTitleArray是第二个表视图中的另一个数组。 –

+0

您的回答对我非常有帮助,谢谢! –