TableView中的insertRows

时间:2017-08-01 18:50:14

标签: ios iphone swift uitableview

我通过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()
}

原因:'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).'

2 个答案:

答案 0 :(得分:2)

设置新表格行时,不会在数组中添加新数据。 在表中插入新行之前添加此代码self.modals.insert("<#DATA#>, atIndex: yourIndex)。并尝试删除DispatchQueue

答案 1 :(得分:0)

如果要在tableView中删除/插入元素,则需要执行以下操作:

  1. 在tableView的支持数据源中添加数据。
  2. 重新加载tableView。
  3. 一些代码来说明这一点(此代码放在didSelectRowAtIndexPath中):

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