将行插入 UItableView 错误
inserting row into UItableView error
我有 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 移出)。'
检查你的代码。您是否在 cellinSection 中返回了正确的 Cells 数量?
此外,用
包装您的插入代码
[tableView beginUpdate];
// Do insertion here.
[tableview endUpdate];
[tableView reloadData];
而在您的代码中,行
self.newsTableView.reloadSections(NSIndexSet.init(index: 0), withRowAnimation:UITableViewRowAnimation.Bottom )
未包含在endUpdate/beginUpdate
中
并且在你的最后一个函数中,你的 reloadData 也在包装之外。
调用后 self.newsTableView.reloadData()
tableView 已经包含新数据。当您尝试进行更新时:
self.newsTableView.beginUpdates()
//代码
self.newsTableView.endUpdates()
你的数组没有改变。您不应在数组更新时调用 reloadData 或 reloadSections(如果需要,请在函数末尾使用带有动画的插入)。或者您应该使用没有 begin/end 更新的 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()
}
}
}
我有 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 移出)。'
检查你的代码。您是否在 cellinSection 中返回了正确的 Cells 数量?
此外,用
包装您的插入代码 [tableView beginUpdate];
// Do insertion here.
[tableview endUpdate];
[tableView reloadData];
而在您的代码中,行
self.newsTableView.reloadSections(NSIndexSet.init(index: 0), withRowAnimation:UITableViewRowAnimation.Bottom )
未包含在endUpdate/beginUpdate
中并且在你的最后一个函数中,你的 reloadData 也在包装之外。
调用后 self.newsTableView.reloadData()
tableView 已经包含新数据。当您尝试进行更新时:
self.newsTableView.beginUpdates()
//代码
self.newsTableView.endUpdates()
你的数组没有改变。您不应在数组更新时调用 reloadData 或 reloadSections(如果需要,请在函数末尾使用带有动画的插入)。或者您应该使用没有 begin/end 更新的 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()
}
}
}