2016-12-17 4 views
0

Когда я просматриваю нижнюю часть таблицы и получаю больше данных со следующим смещением, я добавляю новые объекты в свой массив данных. Однако мое табличное представление перезагружается и возвращается в первую ячейку. Я пытаюсь предотвратить это.Tableview прокручивает вверх, добавляя новые данные. Бесконечный прокрутки

enter image description here

enter image description here

- (void)fetchMovies { 
    [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 

    [self.networkingHelper fetchNowPlayingWithCompletionHandler:^(NSArray *objects, NSError *error) { 

    if (error) { 
     [self showErrorView:self.errorView]; 
    } else { 
     [self hideErrorView:self.errorView]; 
    } 

    [self.movies addObjectsFromArray:objects]; 
    self.displayedItems = self.movies; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.isMoreDataLoading = false; 

     if ([[NSThread currentThread] isMainThread]){ 
      NSLog(@"In main thread--completion handler"); 

      [self.refreshControl endRefreshing]; 
      [self.loadingMoreView stopAnimating]; 
      [MBProgressHUD hideHUDForView:self.view animated:YES]; 
     } else { 
      NSLog(@"Not in main thread--completion handler"); 
     } 
     }); 
     } 

    ]; 
} 

Редактировать Пробовал добавить этот

- (void)fetchMovies { 
    [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 

    [self.networkingHelper fetchNowPlayingWithCompletionHandler:^(NSArray *objects, NSError *error) 
    { 

     if (error) 
     { 
      [self showErrorView:self.errorView]; 
     } 
     else 
     { 
      [self hideErrorView:self.errorView]; 

     } 
     [self.movies addObjectsFromArray:objects]; 
     self.displayedItems = self.movies; 


     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.isMoreDataLoading = false; 


      if ([[NSThread currentThread] isMainThread]){ 
       NSLog(@"In main thread--completion handler"); 

       CGFloat oldOffset = self.moviesTableView.contentSize.height; 
       [self.moviesTableView reloadData]; 
       CGFloat onewOffset = self.moviesTableView.contentSize.height; 
       CGPoint new = CGPointMake(0, onewOffset - oldOffset); 

       [self.moviesTableView setContentOffset:new]; 

       [self.refreshControl endRefreshing]; 
       [self.loadingMoreView stopAnimating]; 
       [MBProgressHUD hideHUDForView:self.view animated:YES]; 


      } 
      else{ 
       NSLog(@"Not in main thread--completion handler"); 
      } 

      }); 
    } 

    ]; 
} 

Еще прокручивает к началу

+0

Я не думаю, что я был чист. Я имел в виду, что мой планшет автоматически переходит в верхнюю ячейку. Я пытаюсь предотвратить это. Таким образом, пользователь может продолжить прокрутку новых записей на следующей странице – mparrish91

+0

, после чего вы хотите прокрутить внизу, значит, ваша последняя ячейка? –

+0

да до последней ячейки. когда пользователь перескакивает на стол, и запрашивается следующая страница. иметь столик и показать следующую страницу. – mparrish91

ответ

1

Вы настраиваете

[self.moviesTableView setContentOffset:CGPointMake(0, self.searchController.searchBar.frame.size.height)]; 

в вашем addSearchBar метода, который вызывается после загрузки более завершена, установка содержания смещения в начальной точке.

Вы также управляете вами setupInfiniteScrollView Где вы добавляете subview в Tableview.

И есть немножко меняется с логикой

начнут извлекать эту старую у смещения позиции

CGFloat oldOffset = self.moviesTableView.contentOffset.y; 

Установить такое же положение Y после нагрузки больше как

CGPoint new = CGPointMake(0, oldOffset); 
[self.moviesTableView setContentOffset:new]; 
+0

Я не получаю вас –

+0

Спасибо, что исправил это для меня. Невнятная ошибка настройки смещения содержимого в другом месте. Я не заметил, что didLayoutSubviews вызывалось несколько раз на прокрутке таблицы. В layoutSubviews у меня была функция awn addSearchBar. В нем я смещал свою строку поиска в начальной точке. – mparrish91

+0

рад помочь ... –

0

Добавить строку в ваш

if ([[NSThread currentThread] isMainThread]){ 
     NSLog(@"In main thread--completion handler"); 

     [self.refreshControl endRefreshing]; 

     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[YOURARRAY.count] - 1 inSection:0]; 
     [self.YOURTABLLENAME scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

     [self.loadingMoreView stopAnimating]; 
     [MBProgressHUD hideHUDForView:self.view animated:YES]; 
} 
0

Вы должны использовать динамическую вставку строк после получения данных:

NSMutableArray *arrayOfInsertedIndexes = [NSMutableArray array]; 
NSInteger currentCount = self.yourOldData.count; 
for (int i =0; i < yourNewData.count; i++) 
{ 
     [arrayOfInsertedIndexes addObject:[NSIndexPath indexPathForRow:currentCount+i inSection:0]]; 
} 
[self.tableView beginUpdates]; 
[self.tableView insertRowsAtIndexPaths:arrayOfInsertedIndexes withRowAnimation:UITableViewRowAnimationRight]; 
[self.tableView endUpdates]; 

Не используйте

[self.tableView reloadData]; 
+1

Вы обновили свой ответ с помощью значения arrayOfInsertedIndexes. –

+0

Масштабируемые индексы - это только новые данные, а не весь массив данных? – mparrish91

+0

@ mparrish91 посмотреть. –

0

Проблема заключается в том, что после того, как reloadData contentSize не меняет синхронными. Вы должны вызвать layoutIfNeeded после reloadData. И только после этого contentSize изменил

Попробуйте

//..... 
if ([[NSThread currentThread] isMainThread]){ 
    NSLog(@"In main thread--completion handler"); 

    CGFloat oldOffset = self.moviesTableView.contentSize.height; 
    [self.moviesTableView reloadData]; 
    [self.moviesTableView layoutIfNeeded]; 
    CGFloat onewOffset = self.moviesTableView.contentSize.height; 
    CGPoint new = CGPointMake(0, onewOffset - oldOffset); 

    [self.moviesTableView setContentOffset:new]; 
    [self.refreshControl endRefreshing]; 
    [self.loadingMoreView stopAnimating]; 
    [MBProgressHUD hideHUDForView:self.view animated:YES]; 
//....... 
0

Objective C:

NSIndexPath* ip = [NSIndexPath indexPathForRow:rowNumberHere inSection:sectionNumberHere]; 
[theTableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

Свифт:

let offset = CGPoint(x: 0, y: self.tableView.contentSize.height - self.tableView.frame.size.height + self.FOOTERHEIGHT); 
self.tableView.contentOffset = offset;