2015-09-19 56 views
2

我有兩個按鈕在視圖控制器和它們下面的表視圖。當兩個按鈕中的一個按下不同的過濾器參數時,表格視圖被刷新。實際上,當表格視圖被加載,然後點擊另一個按鈕時,它工作正常,表格被刷新。但是,當您在表格視圖中滾動並且滾動仍在進行時,您按下另一個按鈕時,出現「索引超出範圍」錯誤。試了很多東西來解決它,但沒有辦法。有任何想法嗎?我使用解析作爲免費會員資格。我的代碼的重要部分是如下:「索引超出範圍」雖然刷新表 - 斯威夫特

@IBAction func filterType0_clicked(sender: AnyObject) { 

    if filterTypeVar != 0 { 


     self.activityIndicator.startAnimating() 
     self.waitView.hidden = false 

    filterTypeVar = 0 
    refreshResults() 
    } 
} 

@IBAction func filterType1_clicked(sender: AnyObject) { 

    if filterTypeVar != 1 { 

     self.activityIndicator.startAnimating() 
     self.waitView.hidden = false 

    filterTypeVar = 1 
    refreshResults() 
    } 
} 



func refreshResults() { 


    resultsNameArray.removeAll(keepCapacity: false) 
    resultsUserNameArray.removeAll(keepCapacity: false) 
    resultsObjectIdArray.removeAll(keepCapacity: false) 


    var query = PFQuery(className: 「posts」) 
    query.whereKey("userName", containedIn: usersArray) 

    if filterTypeVar == 0 { 
    println("no filter") 
    } 
    else { 
    query.whereKey("Type", equalTo: filterTypeVar) 
    } 

    query.addDescendingOrder("createdAt") 
    query.limit = 10 

    query.findObjectsInBackgroundWithBlock { 
     (objects:[AnyObject]?, error:NSError?) -> Void in 

     if error == nil { 

      for object in objects! { 

       self.resultsNameArray.append(object.objectForKey("profileName") as! String) 
       self.resultsUserNameArray.append(object.objectForKey("userName") as! String) 
       self.resultsObjectIdArray.append(object.objectId as String!) 

         self.resultsTable.reloadData() 

      } 

      if self.resultsNameArray.isEmpty { 
      self.resultsTable.hidden = true 
      } 

      else { 
      self.resultsTable.hidden = false 
      } 



      self.activityIndicator.stopAnimating() 
      self.waitView.hidden = true 


     } 

    } 

} 



func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 


    return resultsNameArray.count 

} 



func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

      return 127 

} 






func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    var cell:mainCell = tableView.dequeueReusableCellWithIdentifier("Cell") as! mainCell 



    cell.profileLbl.setTitle(self.resultsNameArray[indexPath.row], forState: UIControlState.Normal) 
    cell.usernameLbl.text = self.resultsUserNameArray[indexPath.row] 
    cell.objectid.text = self.resultsObjectIdArray[indexPath.row] 


    return cell 

} 

回答

6

嘗試重裝表數據您已經完成讀取和填寫的數據數組。另外,清除您的數據陣列一次您有您的查詢數據。

例如,在你的refreshResults方法,移動for循環的self.resultsTable.reloadData()外:

resultsNameArray.removeAll(keepCapacity: false) 
resultsUserNameArray.removeAll(keepCapacity: false) 
resultsObjectIdArray.removeAll(keepCapacity: false) 
// You could reload again here; this might be superfluous. 
self.resultsTable.reloadData() 

for object in objects! { 

    self.resultsNameArray.append(object.objectForKey("profileName") as! String) 
    self.resultsUserNameArray.append(object.objectForKey("userName") as! String) 
    self.resultsObjectIdArray.append(object.objectId as String!) 
} 

// Moved the refresh outside of loop so that you 
// aren't reloading the table until you've finished 
// loading your data. 
self.resultsTable.reloadData() 
+2

還是一樣,我猜陣列的數量不符合與numberofrowsinsection部分。 – saner

+0

我放了一些println()來理解問題的起點。錯誤在「query.limit = 10」部分之後開始。那裏顯示了最後一個println。 – saner

+1

我剛剛注意到,在獲取數據之前清除了數組。由於提取是異步運行的,因此一旦獲得數據,就應該清除數組。那從那以後呢?查看更新的代碼。 – whyceewhite