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)
. 我收到的是,我在第一次加载时从0
to收到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 {
...
}
在经历了几个小时的崩溃后,它对我来说效果很好。希望这可以帮助!
归档时间: |
|
查看次数: |
1563 次 |
最近记录: |