2011-04-04 58 views
23

我試圖讓一個UITableView去頁面的頂部,當我重新加載表數據時,我打電話從如何讓UITableview在重新加載時進入頁面頂部?

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 

// A bunch of code … 

[TableView reloadData]; 
} 

本着同樣的精神下,我也想能去當我重新加載表格數據時到特定的部分。

我試圖把下面這之前和重裝後只到行似乎適用,但沒有任何反應:

[TableView scrollToRowAtIndexPath:0 atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

回答

51

這裏的另一種方式,你可以這樣做:

Objective-C的

[tableView setContentOffset:CGPointZero animated:YES]; 

斯威夫特3

tableView.setContentOffset(.zero, animated: true) 

也許最簡單,最直接的方式去做吧。

+0

謝謝。這讓我到頁面的頂部,這是我的迫切需要。 – AppsToKnow 2011-04-04 20:47:19

+1

有時這應該在延遲0.1秒後執行。例如'DispatchQueue.main.asyncAfter(截止日期:.now()+ 0.1,執行:{table_view.setContentOffset(。零,動畫:假) }) – 2017-11-13 15:18:11

4

的UITableView是的UIScrollView的子類,所以你也可以使用:

[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES]; 
+0

謝謝。我試過這個,它工作得很好,但我用下面的例子。 – AppsToKnow 2011-04-04 20:50:59

14

要滾動到一個特定的部分,你需要指定它的索引路徑:

​​

如果您不確定tableView中的行數。使用以下命令:

NSIndexPath *topPath = [NSIndexPath indexPathForRow:NSNotFound inSection:0]; 
[TableView scrollToRowAtIndexPath:topPath 
       atScrollPosition:UITableViewScrollPositionTop 
         animated:YES]; 
+4

您應該確保表中存在該行,否則會引發異常。 – 2011-04-04 20:07:14

+0

感謝此代碼。我已經發布了我的應用程序,但我想在第一次更新中使用它。 – AppsToKnow 2011-04-13 12:47:36

+0

@CameronSpickert查看已更新的條件。 – 2017-10-25 10:10:52

0

如果您在重新加載前滾動並且行數減少,您可能會產生一些奇怪的動畫行爲。爲了確保重載後的滾動情況,使用這樣的方法:

- (void)reloadTableViewAndScrollToTop:(BOOL)scrollToTop { 
    [self.tableView reloadData]; 
    if (scrollToTop) { 
     [self.tableView setContentOffset:CGPointZero animated:YES]; 
    } 
} 
9

閱讀所有的答案在這裏和其他地方後,我終於找到了可靠地工作和之後的數據加載不顯示滾動的解決方案。我的回答是在此基礎上post和我的觀察,你,如果你使用的是內容的插圖需要負偏移:

func reloadAndScrollToTop() { 
    tableView.reloadData() 
    tableView.layoutIfNeeded() 
    tableView.contentOffset = CGPoint(x: 0, y: -tableView.contentInset.top) 
} 
+1

這應該被標記爲正確的答案,因爲它承認之前設置的任何插入 – 2017-05-14 04:54:30

+0

這個組合和改變'tableView.estimatedRowHeight'到我的頂部分隔符的高度做的工作我。 – Deco 2017-10-03 13:05:15

+0

'tableView.layoutIfNeeded()'幫了我1-2小時的掙扎! – SoftDesigner 2017-11-06 12:19:38

1

在SWIFT 3.1

DispatchQueue.main.async(execute: { 

     self.TableView.reloadData() 
     self.TableView.contentOffset = .zero 

    }) 
1

這是爲我工作。

tableView.scrollToRow(at: IndexPath.init(row: 0, section: 0), at: .top, animated: true) 
+0

最好的方法,如果你的項目數量之前已經改變(與reloadData) – RPallas 2018-01-17 08:53:46

相關問題