【问题标题】:inserting row into UItableView error将行插入 UItableView 错误
【发布时间】:2015-03-03 07:56:09
【问题描述】:

我有一个 tableView,它从 url api 提供了 10 个项目的数据。当它向下滚动时,我尝试获取下 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 移出)。'

【问题讨论】:

    标签: ios iphone uitableview swift alamofire


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      查看您的代码。您是否在 cellinSection 中返回了正确的细胞计数?

      另外,用

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

      而在您的代码中,行

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

      没有包含在 endUpdate/beginUpdate 中

      在你的最后一个函数中,你的 reloadData 也在包装之外。

      【讨论】:

      • func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.tableViewNews.count } 这里是 numberOfRowsInSection,我已将 self.tableViewNews.addObject(newsItem) 添加到数组中。同样在调试器中更新后的行数是 11,所以我认为还可以
      • @nabiullinas 它还说加/减更新,并且您添加了一行,添加后使其变为 12。:)
      • 如果您只使用一种方法来重新加载/插入部分/行,则不应将其包装以开始/结束更新
      • @iosDev82 hmhmhm,我想我没有正确理解你=(我需要做什么?我向 tableViewNews(dataSource 数组)添加了新项目,并插入了新行。所以我想念什么?
      • 我找到了。我在我的数组中使用 self.newsTableView.reloadSections(NSIndexSet.init(index: 0), withRowAnimation:UITableViewRowAnimation.Bottom ) 来获取数据,所以它在 beginUpdates 之前重新加载数据!!谢谢=)
      猜你喜欢
      • 2013-11-28
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多