2015-03-03 3 views
0

У меня есть таблицаView, которая привела данные из url api на 10 элементов. Когда он прокручивается вниз, я пытаюсь получить следующие 10 элементов и вставить их в строку. Так в viewDidload я получаюВставка строки в ошибку UItableView

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 

Invalid обновление: неверное число строк в разделе 0. Число строк содержится в существующий раздел после обновления (11) должен быть равен количеству строк, содержащихся в этом разделе, перед обновлением (11) плюс или минус количество строк, вставленных или удаленных с этой секунды (1 вставлено, 0 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено, 0 выведено). '

ответ

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() 
     } 
    } 
} 
0

Просмотрите свой код. Вы возвращаете правильное количество ячеек в вашем cellinSection?

Кроме того, обернуть код вставки с

[tableView beginUpdate]; 
// Do insertion here. 
    [tableview endUpdate]; 
    [tableView reloadData]; 

Если в вашем коде, линии

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

не завернутые в EndUpdate/BeginUpdate

И в последней функции, ваш reloadData находится за пределами оберток.

+0

функ Tableview (Tableview: UITableView, numberOfRowsInSection раздел: Int) -> Int { возвращение self.tableViewNews.count } здесь это numberOfRowsInSection, и я добавил self.tableViewNews.addObject (newsItem) в массив. Также в отладчике число строк после обновления равно 11, поэтому я думаю, что это нормально – nabiullinas

+0

@nabiullinas. Он также говорит о плюсе/минусе обновления, и вы добавили строку, которая при добавлении делает это 12. :) –

+0

Если вы используете только один метод для перезагрузки/вставки разделов/строк, вы не должны его обертывать, чтобы начать/завершить обновления –

Смежные вопросы