如何在分页时向UITableView添加行?

时间:2017-04-10 09:03:19

标签: ios swift uitableview

一旦用户到达UITableView的底部,我试图将我的UITableView附加更多行。但是,一旦我尝试滚动到底部以调用更多数据,我会收到一条错误消息:

 fatal error: Index out of range

这是我的代码:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let contentOffset = scrollView.contentOffset.y
    let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
    if !isLoadingMore && (maximumOffset - contentOffset <= threshold) {
        self.isLoadingMore = true

        DispatchQueue.main.async() {
            self.fetchMovieData()
            self.isLoadingMore = false
        }
    }
}

我还跟踪我的表视图中添加了多少行,因为调用的数据越多,我的rowNumber计数就越多:

var rowNumber: Int = 0

以下是我提出要求的地方:

func fetchMovieData(_ url: String,_ params: Dictionary<String, String>) {
        if more {
            Alamofire.request(url, parameters: params)
                .responseJSON {
                    response in
                    switch response.result {
                    case .success(let value):
                        self.currentPageNumber += 1
                        let json = JSON(value)
                        self.movieObject = [MovieModel.init(data: json)]
                        self.rowNumber += self.movieObject[0].movieList[0].movieDict.count
                        self.tableView.reloadData()
                    case .failure(let error):
                        print(error)
                }
            }
        }
    }

所以我想我的问题是我应该打电话:

self.tableView.reloadData()

为了在表格视图中添加更多数据,或者我有什么遗漏?

1 个答案:

答案 0 :(得分:2)

问题是你没有为你的数组添加更多的数据,而是用新的数据替换旧的数据,这将保持数组数为10,但行数会增加,因此索引超出范围将发生错误,因为您尝试访问数组[11],但该数组中只有10个元素。

要解决这个问题,请尝试用以下方法替换您的函数:

 func fetchMovieData(_ url: String,_ params: Dictionary<String, String>) {
    if more {
        Alamofire.request(url, parameters: params)
            .responseJSON {
                response in
                switch response.result {
                case .success(let value):
                    self.currentPageNumber += 1
                    let json = JSON(value)
                    let newArray = [MovieModel.init(data: json)]
                    for i in newArray {
                   self.movieObject.append(i)
                  }
                    self.movieObject = [MovieModel.init(data: json)]
                    self.rowNumber += self.movieObject[0].movieList[0].movieDict.count
                    self.tableView.reloadData()
                case .failure(let error):
                    print(error)
            }
        }
    }
}