将行插入UItableView错误

时间:2015-03-03 07:56:09

标签: ios iphone uitableview swift alamofire

我有tableView,它通过10个项目从url api中提供数据。当它向下滚动时,我尝试获取下一个10项并将它们插入行中。 所以在viewDidload中我得到了

 Alamofire.request(.GET, urlQuery, parameters: ["universityId": UBUniversitySettings.getUniversityId(), "page" : currentPage, "pageSize" : 10]).responseJSON{ (request, response, JSON, error) in
            println(JSON)
            var newsResponse = JSON! as NSArray
            for newsItemResponse in newsResponse{
                var newsItem:NewsModel = NewsModel()
                newsItem.newsImage = newsItemResponse.valueForKey("previewPic") as? String
                newsItem.newsTitle = newsItemResponse.valueForKey("title") as? String
                newsItem.newsDescription = newsItemResponse["content"] as? String
                newsItem.newsId = newsItemResponse["id"] as? String
                self.tableViewNews.addObject(newsItem)

               // self.newsTableView.reloadData()
                self.newsTableView.reloadSections(NSIndexSet.init(index: 0), withRowAnimation:UITableViewRowAnimation.Bottom )


            }
            self.currentPage = self.currentPage + 1

        }

并在

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if(indexPath.row == self.currentPage * 10  - 1){
        self.getNextNews()
    }
}

我得到下一个项目

func getNextNews(){
    Alamofire.request(.GET, urlQuery, parameters: ["universityId": UBUniversitySettings.getUniversityId(), "page" : currentPage, "pageSize" : 10]).responseJSON{ (request, response, JSON, error) in
        println(JSON)
        var newsResponse = JSON! as NSArray
        if(newsResponse.count > 0){
            var newsIndex:NSInteger = 0
            var paths:NSMutableArray = NSMutableArray()
            for newsItemResponse in newsResponse{

                var newsItem:NewsModel = NewsModel()
                newsItem.newsImage = newsItemResponse.valueForKey("previewPic") as? String
                newsItem.newsTitle = newsItemResponse.valueForKey("title") as? String
                newsItem.newsDescription = newsItemResponse["content"] as? String
                newsItem.newsId = newsItemResponse["id"] as? String
                self.tableViewNews.addObject(newsItem)

                // self.newsTableView.reloadData()
                self.newsTableView.reloadSections(NSIndexSet.init(index: 0), withRowAnimation:UITableViewRowAnimation.Bottom )
                var indexPathVal = self.currentPage * 10 + newsIndex

                var indexPath = NSIndexPath(forRow: indexPathVal as Int, inSection: 0)
                paths.addObject(indexPath)
                newsIndex = newsIndex + 1

            }
            self.newsTableView.reloadData()
            self.newsTableView.beginUpdates()

            self.newsTableView.insertRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.Bottom)
            self.currentPage = self.currentPage + 1
            self.newsTableView.endUpdates()



        }

    }
}

But my app crashed and give me a message 

无效更新:第0节中的行数无效。更新后的现有部分中包含的行数(11)必须等于更新前该部分中包含的行数(11),或者减去从该部分插入或删除的行数(插入1个,删除0个),加上或减去移入或移出该部分的行数(0移入,0移出)。'

2 个答案:

答案 0 :(得分:0)

查看您的代码。你在cellinSection中返回了正确的Cell数吗?

另外,用

包装插入代码
    [tableView beginUpdate];
// Do insertion here. 
    [tableview endUpdate];
    [tableView reloadData];

而在您的代码中,行

self.newsTableView.reloadSections(NSIndexSet.init(index: 0), withRowAnimation:UITableViewRowAnimation.Bottom )

未包含在endUpdate / beginUpdate

在你的上一个函数中,你的reloadData也不在包装之内。

答案 1 :(得分:0)

调用self.newsTableView.reloadData()后,tableView已包含新数据。当你尝试更新时:      self.newsTableView.beginUpdates()      //码      self.newsTableView.endUpdates() 您的阵列未更改。在阵列更新时不应调用reloadData或reloadSections(如果需要,请在函数末尾使用带动画的插入)。或者您应该使用reloadData或reloadSections而不进行开始/结束更新。

你的方法应该是:

 func getNextNews(){
     Alamofire.request(.GET, urlQuery, parameters: ["universityId": UBUniversitySettings.getUniversityId(), "page" : currentPage, "pageSize" : 10]).responseJSON{ (request, response, JSON, error) in
         println(JSON)
         var newsResponse = JSON! as NSArray
         if(newsResponse.count > 0){
             //code
            self.tableViewNews.addObject(newsItem)

            //self.newsTableView.reloadSections(NSIndexSet.init(index: 0), withRowAnimation:UITableViewRowAnimation.Bottom )

        }
        //self.newsTableView.reloadData()
        self.newsTableView.beginUpdates()

        self.newsTableView.insertRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.Bottom)
        self.currentPage = self.currentPage + 1
        self.newsTableView.endUpdates()
        }
    }
}

或者:

      func getNextNews(){
     Alamofire.request(.GET, urlQuery, parameters: ["universityId": UBUniversitySettings.getUniversityId(), "page" : currentPage, "pageSize" : 10]).responseJSON{ (request, response, JSON, error) in
         println(JSON)
         var newsResponse = JSON! as NSArray
         if(newsResponse.count > 0){
             //code
            self.tableViewNews.addObject(newsItem)

            self.newsTableView.reloadSections(NSIndexSet.init(index: 0), withRowAnimation:UITableViewRowAnimation.Bottom )

        }
        self.newsTableView.reloadData()
        //self.newsTableView.beginUpdates()

        //self.newsTableView.insertRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.Bottom)
        self.currentPage = self.currentPage + 1
        //self.newsTableView.endUpdates()
        }
    }
}