ios - "Index Out Of Range"刷新表时 - Swift

标签 ios swift uitableview parse-platform indexoutofboundsexception

我在 View Controller 中有两个按钮,在它们下面有一个表格 View 。当使用不同的过滤器参数按下两个按钮之一时,表格 View 将被刷新。实际上,当加载表格 View 然后单击另一个按钮时,它工作正常并且表格被刷新。但是,当您在表格 View 中滚动并且滚动仍在发生时,您按下另一个按钮,我收到“索引超出范围”错误。尝试了很多事情来解决它,但就是做不到。有任何想法吗?我使用 parse 作为免费成员(member)。我的代码的重要部分如下:

  @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

}

最佳答案

完成获取和填充数据数组后,尝试重新加载表格数据。另外,一旦您有查询数据,请清除您的数据数组。

例如,在您的 refreshResults 方法中,将 self.resultsTable.reloadData() 移到 for 循环之外:

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()

关于ios - "Index Out Of Range"刷新表时 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32669729/

相关文章:

ios - 隐藏特定单元格的自定义 ViewTableCell 按钮

ios - Xcode 7 警告 : object file was built for newer iOS version than being linked

ios - Swift iBeacon 使用 accuracy 或 rssi 来保持距离

javascript - 如何在 JavaScript 中为桌面和移动设备创建不同的 onclick 行为?

ios - Alamofire:在展开可选值时意外发现 nil

ios - ViewForHeaderInSection 代码仅适用于 header 出列

arrays - 我想从多个 tableView 选择创建一个数组

ios - Coredata 链接关系

swift - Alamofire 发送对象作为参数

swift - 无法在 Playground 上显示 View