“RefreshControl”上的“数组索引超出范围”

sen*_*nty 4 uitableview ios swift

我有一个 TableView,我正在从 api 获取数据。获取/显示数据和分页/无限滚动时一切正常。但是,当我尝试使用 RefreshControl 时,它崩溃并显示错误:

数组索引超出范围

 var theRefreshControl: UIRefreshControl!
 var results: [JSON]! = []
    // more stuff..

 func refresh(sender: AnyObject) {
        if isFirstLoad == false {
            self.results = []
            currentPage = 1
            getPosts()
        }
        self.theRefreshControl.endRefreshing()
    }

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

    let cell : PostCell = tableView.dequeueReusableCellWithIdentifier("PostCell") as! PostCell

    cell.delegate = self

    print(indexPath.row) // check below.

    let post = self.results![indexPath.row]    // 'array index out of range' here.

 }
Run Code Online (Sandbox Code Playgroud)

为了获得有关错误的更多详细信息,我尝试添加print(indexPath.row). 我收到的是,我在第一次加载时从0to收到10,然后一旦我刷新,它就会变得很奇怪:

在此处输入图片说明

另外,当我点击 (i) 时:

{长度 = 2,路径 = 0 - 9}

有趣的是,完全相同的方法适用于我的其他 TableViewControllers,只有这个方法有问题。可能是什么问题?


func getPosts() {
    isLoading = true

Alamofire.request(.GET, link & params: ["page":"\(currentPage ?? 1)"])
  .responseJSON { response in

      // error checks

    if let data = json["data"].arrayValue as [JSON]? {

        self.lastPage = json["last_page"].int!
        self.currentPage = json["current_page"].int!

        if self.currentPage == 1 {
           self.results = data
           self.tableView.reloadData() 
        } else {                             
           var currentCount = self.results!.count;
           var indxesPath : [NSIndexPath] = [NSIndexPath]()

           for result in data {
             indxesPath.append(NSIndexPath(forRow:currentCount,inSection:0));
              self.results?.append(result)
              currentCount++
           }

     self.tableView.insertRowsAtIndexPaths(indxesPath, withRowAnimation: UITableViewRowAnimation.Bottom)                       
    }
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,我在刷新按钮操作功能中results.removeAll()也尝试过results.removeAll(keepCapacity: false),但没有运气。对于`print(indexPath.row) - 0 到 10 在第一次加载和刷新时,我仍然遇到相同的错误和相同的日志,奇怪的是 6, 7, 8, [], 9

小智 5

Swift 3.0 - 这里有同样的问题,以与 @mcclux 类似的方式解决,但少了一步。

使用内置的 UIRefreshControl。 var refreshControl: UIRefreshControl!,然后在 viewDidLoad 中配置它:

    refreshControl = UIRefreshControl.init()
    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
    refreshControl.addTarget(self, action: #selector(yourViewControllerName.yourFunctionToCallOnRefresh), for: UIControlEvents.valueChanged)
    tableView.addSubview(refreshControl)
Run Code Online (Sandbox Code Playgroud)

然后你可以将你的代码包装在 cellForRowAt indexPath 中

if !self.refreshControl.isRefreshing { ... }

在经历了几个小时的崩溃后,它对我来说效果很好。希望这可以帮助!