加载带有错误的表视图时应用程序崩溃"无效更新:无效的节数。"

时间:2017-05-04 05:56:24

标签: ios swift uitableview

应用程序崩溃并显示以下错误:

  

无效更新:无效的部分数量。部分的数量   更新后的表视图中包含的(6)必须等于   更新前表视图中包含的节数(3),   加或减插入或删除的部分数量(0插入,   0删除)。'请帮忙

我的代码:

func numberOfSections(in tableView: UITableView) -> Int {

    return newsArray.count

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


    let cell = tableView.dequeueReusableCell(withIdentifier: "CellID", for: indexPath) as? NewsTableViewCell


    cell?.contentView.backgroundColor = UIColor.clear

    let whiteRoundedView : UIView = UIView(frame: CGRect(x: 10, y: 4, width: self.view.frame.size.width - 20, height: 410))

    whiteRoundedView.layer.backgroundColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1.0, 1.0, 1.0, 0.9])
    whiteRoundedView.layer.masksToBounds = false
    whiteRoundedView.layer.cornerRadius = 2.0
    whiteRoundedView.layer.shadowOffset = CGSize(width: -1, height: 1)
    whiteRoundedView.layer.shadowOpacity = 0.2

    cell?.contentView.addSubview(whiteRoundedView)
    cell?.contentView.sendSubview(toBack: whiteRoundedView)

    let newsdata = newsArray[indexPath.section]

    let date = NSDate(timeIntervalSince1970: TimeInterval(newsdata.meta))
    let dayTimePeriodFormatter = DateFormatter()
    dayTimePeriodFormatter.dateFormat = "MMM dd YYYY "

    let dateString = dayTimePeriodFormatter.string(from: date as Date)


    print(dateString)

    if let newsImg = self.newsImageCache.object(forKey: indexPath.section as AnyObject){
        cell?.imageOut.image = newsImg as? UIImage
    } else {
        loadImageFromWeb(uri: newsdata.photo, cache: self.newsImageCache, indexpath: indexPath)

    }
    cell?.titleLabel.text = newsdata.title
    cell?.descLabel.text = newsdata.body


    return cell!
}




 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    if indexPath.section + 3 == self.newsArray.count {

        loadDatafromUrl()
    }
}



func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 20
}

// Make the background color show through
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = UIView()
    headerView.backgroundColor = UIColor.clear
    return headerView
}



func loadDatafromUrl(){
    let uri = "http://localhost/unani-info/admin/json/news.php"
    print(uri)
    if let url = URL(string: uri){

        let config = URLSessionConfiguration.default
        config.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData
        let session = URLSession(configuration: config)

        let task = session.dataTask(with: url, completionHandler: {

            (rawData,response,error) in

            if error != nil {
                print("Couldnt load data")
                print(error?.localizedDescription as Any)

            } else {
                if let data = rawData {
                    do{
                        if let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [AnyObject]{

                            for index in 0...json.count-1 {

                                if let datas = json[index] as? [String: AnyObject] {

                                    let newsObj = News()
                                    newsObj.title = datas["title"] as! String
                                    newsObj.body = datas["body"] as! String
                                    let photo = datas["photo"] as! String
                                    let photourl = "http://localhost/unani-info/admin/uploads/" + photo
                                    newsObj.photo = photourl
                                    newsObj.meta = datas["meta"] as! Int

                                    self.newsArray.append(newsObj)


                                }

                            }
                            DispatchQueue.main.async {
                                self.tableView.reloadData()
                            }

                        }
                    }catch{
                        print("error")
                    }
                }
            }
        })
        task.resume()
    }

}

2 个答案:

答案 0 :(得分:1)

请你试试:

DispatchQueue.main.async {
    for index in 0...json.count-1 {
        if let datas = json[index] as? [String: AnyObject] {
            let newsObj = News()
            newsObj.title = datas["title"] as! String
            newsObj.body = datas["body"] as! String
            let photo = datas["photo"] as! String
            let photourl = "http://localhost/unani-info/admin/uploads/" + photo
            newsObj.photo = photourl
            newsObj.meta = datas["meta"] as! Int
            self.newsArray.append(newsObj)
        }
    }
    self.tableView.reloadData()
}

而不是:

for index in 0...json.count-1 {
    if let datas = json[index] as? [String: AnyObject] {
        let newsObj = News()
        newsObj.title = datas["title"] as! String
        newsObj.body = datas["body"] as! String
        let photo = datas["photo"] as! String
        let photourl = "http://localhost/unani-info/admin/uploads/" + photo
        newsObj.photo = photourl
        newsObj.meta = datas["meta"] as! Int
        self.newsArray.append(newsObj)
    }
}
DispatchQueue.main.async {
    self.tableView.reloadData()
}

答案 1 :(得分:1)

您正在反转numberOfSectionsnumberOfRowsInSection。你应该:

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return newsArray.count
}