我通过 JSON 获取数据,当我滚动屏幕时,我向服务器发出请求,有时数据可能会结束,然后应用程序在 insertRows
上崩溃,我该如何修复它?
这是我的代码:
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
if (!isMoreDataLoading) {
let down = "https://--.com/local/apps/apple/events.php/?nPageSize=\(nPageSize)&iNumPage=\(iNumPage)"
let scrollViewContentHeight = tableView.contentSize.height
let scrollOffsetThreshold = scrollViewContentHeight - tableView.bounds.size.height
if(scrollView.contentOffset.y > scrollOffsetThreshold && tableView.isDragging) {
isMoreDataLoading = true
requestD(url: down)
}
}
}
func requestD(url:String){
var urlRequest = URLRequest(url: URL(string: url)!)
urlRequest.timeoutInterval = 300
let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
if error != nil{
print(error ?? 0)
return
}
do{
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : AnyObject]
if let newsJson = json["EVENTS"] as? [[String : AnyObject]] {
for newJson in newsJson{
let info = Modal()
info.id = newJson["ID"] as? String
info.name = newJson["NAME"] as? String
if newJson["PICTURE"] as? String != nil {
info.ImageViewURL = newJson["PICTURE"] as! String
}
if newJson["PICTURE_DETAIL"] as? String != nil {
info.ImageViewURLDetail = newJson["PICTURE_DETAIL"] as! String
}
info.stmp = newJson["STMP"] as? Int
info.text = newJson["DETAIL_TEXT"] as? String
info.name = info.name?.replacingOccurrences(of: "&[^;]+;", with: "", options: String.CompareOptions.regularExpression, range: nil)
info.text = info.text?.replacingOccurrences(of: "&[^;]+;", with: "", options: String.CompareOptions.regularExpression, range: nil)
if self.isRefresh == true {
self.modals.insert(info, at: 0)
} else {
self.modals.append(info)
}
}
}
} catch let error {
print(error)
}
DispatchQueue.main.sync {
self.iNumPage += 1
self.isMoreDataLoading = false
self.Preload.preloadEnd(tableView: self.tableView)
// self.tableView.reloadData()
self.tableView.beginUpdates()
self.tableView.insertRows(at: [IndexPath(row: self.modals.count - 1, section: 0)], with: .automatic)
self.tableView.endUpdates()
}
}
task.resume()
}
原因:'无效更新:第 0 节中的行数无效。更新 (5) 后现有节中包含的行数必须等于更新前该节中包含的行数(0),加上或减去从该部分插入或删除的行数(1 插入,0 删除)以及加上或减去移入或移出该部分的行数(0 移入,0 移出)。
最佳答案
当您设置新的表格行时,您不会在数组中添加新数据。
添加此代码 self.modals.insert("<#DATA#>, atIndex: yourIndex)
在表中插入新行之前。并尝试删除DispatchQueue
关于ios - 在 TableView 中插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45445570/