2017-08-01 50 views
2

我通过JSON获取数据,当我滚动屏幕时,我有一个请求到服务器,有时数据可以结束,然后应用程序崩溃insertRows我该如何解决它?insertView在表查看

这里我的代码:

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

原因:'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

+0

什么是崩溃消息? – Paulw11

+0

@ Paulw11有问题的原因 – Vasya2014

回答

0

如果要删除/ TableView中插入一个元素,你需要做到以下几点:

  1. 添加数据在tableView的后备数据源中。
  2. 重新载入tableView。

一些代码来说明点(此代码被放置在didSelectRowAtIndexPath方法):

anArray.insert("This String", atIndex: indexPath.row) 
tableView.reloadData() 
2

当设置新的表格行您没有在阵列中添加新数据。 在表中插入新行之前添加此代码self.modals.insert("<#DATA#>, atIndex: yourIndex)。并尝试删除DispatchQueue

+0

你不明白我的问题。我需要锁定,如果没有数据时,用户滚动下来 – Vasya2014

+1

因此,更新表中的块在哪里你添加新行 –

+0

由于数据任务需要时间和插入表正在调用两个代码不同步,您的表插入代码不在等待数据来 –