2016-12-17 94 views
0

當我滾動到我的tableview的底部,並獲取更多的數據與下一個偏移量,我將新的對象添加到我的數據數組。然而,我的tableview重新加載並返回到第一個單元格。我試圖阻止這一點。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

我不認爲我很清楚。我的意思是我的tableview自動進入頂層單元格。我試圖阻止這一點。所以用戶可以繼續滾動瀏覽下一頁的新條目 – mparrish91

+0

,那麼你想滾動底部意味着你的最後一個單元? –

+0

是對最後一個單元格。當用戶在桌面上向下滑動並請求下一頁時。有桌面停留並顯示下一頁。 – mparrish91

回答

1

要設置

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

addSearchBar方法正在被更多的負荷結束後調用,設置的內容在初始點偏移。

也管理你setupInfiniteScrollView你在子視圖中添加Tableview的地方。

並且存在與邏輯有點變化

取這個老y偏移位置

CGFloat oldOffset = self.moviesTableView.contentOffset.y; 

設置相同的Y位置負荷後更像

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

我沒有得到你 –

+0

謝謝你這個修復了我。在其他地方設置內容偏移的愚蠢錯誤。我沒有注意到didLayoutSubviews在表格滾動中被多次調用。在layoutSubviews中,我使用了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

arrayofinsertedindexes只是新數據而不是整個數據數組? – mparrish91

+0

@ mparrish91看一看。 –

0

的問題是,經過reloadData contentSize不會改變同步。你應該在reloadData之後調用layoutIfNeeded。只有經過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

目標C:

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

Swift:

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