2010-05-28 36 views
9

帶桌子的觀點得到被推到屏幕前,我希望它滾動到某行的表的屏幕實際顯示之前。我在最終的視圖控制器內使用這段代碼。滾動立即在表中的行視圖顯示

NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
[theTable scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

當我把它放在viewDiDAppear方法,然後將它簡單地從表中的位置INTIAL(頂部)閃爍我想要的行。我不想讓它顯示出初始狀態。如果我把它放在viewDidLoad或viewWillAppear中,那麼它會崩潰並出現一個NSRangeException,大概是因爲該表尚未設置。

我將如何得到它沒有表現出初始位置滾動?

+1

[這](http://stackoverflow.com/questions/2289114/make-uitableview-selection-before-view-appears/2289812#2289812)和[此](HTTP://計算器。 com/questions/2156614/how-to-start-uitableview-on-the-last-cell)可能會有所幫助。 – DyingCactus 2010-05-28 21:16:40

回答

13

由於粗野和死亡仙人掌指着我在正確的方向。答案是加載在viewWillAppear中的表和滾動:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [theTable reloadData]; 
    NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
    [theTable scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 
+1

一定要標記自己的答案被接受,以便其他讀者可以看到這個問題一目瞭然:) – BoltClock 2010-06-06 14:31:08

+0

這是我所需要的。唯一不同的是我使用了UITableViewScrollPositionNone而不是ScrollPositionTop,因此用戶可以儘可能多地查看所選行上的表。 – RanLearns 2012-03-23 19:13:00

+1

這對我來說不起作用,因爲在較新版本的iOS(5和6)上我沒有看到由OS設置的幀,直到viewWillAppear之後。 viewWillLayoutSubviews/viewDidLayoutSubviews在viewDidAppear之前不會被調用。 – Logachu 2013-04-25 17:02:37

2

如果我把它放在viewDidLoad中或 viewWillAppear中,然後將其與 NSRangeException崩潰,大概是因爲 表中尚未設定。

爲什麼沒有在表中設置了嗎?你在哪種方法設置?

+0

好吧,它被創建在cellforrowatindexpath – cannyboy 2010-05-28 20:46:49

+1

你可以加載表viewWillAppear – 2010-05-28 21:51:29

1

我剛剛完成與此搏鬥。我在搜索列表的頂部添加了一個搜索欄,最初隱藏在頂部......一些核心應用程序。我其實會問這個問題!

我恐怕會提出這個問題,因爲看起來那些提供東西的人被擊垮了..但是......我很驚訝沒有一個簡單的解決方案......所以我最終這樣做了:

我用ABTableViewCell(你可以google一下),自定義繪製細胞(很好,速度很快!),當我得到所謂繪製第二行(你可以在你的customly繪製細胞無ABTableViewCell做到這一點),我將它設置有與單一的火信號:

if (self.mOnlyOnce == NO && theRow > 1) { 
    self.mOnlyOnce = YES; 
    [self.mParentTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 

(自由選擇合適的行/節,以適合你......如果他們在同一個部分,你可能會被排設置的東西而不是0)

如果你討厭我的解決方案(因爲我還不能評論),請幫我把它留在零&讓更好的解決方案來到頂部。

哦,也有關於你的隱藏在頂部的搜索條目......但我的已經做了一個自定義單元格...這裏是link

享受

-1
iOS中8

及以上[self.tableView reloadData]viewWillAppearscrollToRowAtIndexPath前不工作,你必須做在viewDidAppear重載,如下所示:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:YES]; 

    [self.tableView reloadData]; 

    [self.tableView scrollToRowAtIndexPath:[[NSIndexPath indexPathForRow:18 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

} 

注意:你必須使用UITableViewScrollPositionTop,否則滾動將無法達到預期,並可能滾動至底部,甚至到最後一行後,如果指定scrollToRow爲最後一排空白區域。

我覺得在iOS 8及以上版本中第一次加載tableView時並不會加載所有用來構造表格的數據,這就是您必須使用[tableView reload]的原因,我認爲這有點奇怪。

2

致電scrollToRowAtIndexPath:viewWillAppear:不適用於我,因爲tableView尚未加載。但我可以在延遲一段時間後致電scrollToRowAtIndexPath:來解決這個問題。

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    [self performSelector:@selector(scrollToCell) withObject:nil afterDelay:0.1]; 
} 

- (void) scrollToCell 
{ 
    [_tableView reloadData]; 
    NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
    [_tableView scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 

希望它能幫助別人。

+2

此答案效果更好,但您也可以改用dispatch_after。 – harshalb 2015-09-10 07:27:21

+0

在iOS 8上嘗試了很多東西,只有這樣才行。但是也可以在主線程上使用'dispatch_async'。 – 2015-11-28 16:21:25

+0

0的延遲也可以正常工作,並且看起來好於100ms,在你推動表格後你仍然會看到它跳100ms – 2015-12-13 16:06:38

1

您可以使用GCD將滾動分派到viewDidLoad中主運行循環的下一個迭代中以實現此行爲。滾動將在屏幕上顯示錶格視圖之前執行,因此不會閃爍。

- (void)viewDidLoad { 
    dispatch_async (dispatch_get_main_queue(), ^{ 
     NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH; 
     [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
    }]; 
} 
4

我有完全相同的問題,亂投醫後,這個工作,關鍵是如果你使用自動佈局,你必須寫在viewDidLayoutSubviews

scrollToBottom代碼

初始化scrollToBottom爲true,然後做到這一點

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    // Scroll table view to the last row 
    [self scrollToBottom]; 
} 

-(void)scrollToBottom { 
    if (shouldScrollToLastRow) 
    { 
     CGPoint bottomOffset = CGPointMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height); 
     [self.tableView setContentOffset:bottomOffset animated:NO]; 
    } } 

這樣做將確保你在你的底部是幾乎是的tableView但可能不是在最底層作爲其不可能知道確切的底部,當你在的tableView的頂偏,所以之後我們可以實現scro llViewDidScroll

-(void)scrollViewDidScroll: (UIScrollView*)scrollView 
{ 
    float scrollViewHeight = scrollView.frame.size.height; 
    float scrollContentSizeHeight = scrollView.contentSize.height; 
    float scrollOffset = scrollView.contentOffset.y; 

    // if you're not at bottom then scroll to bottom 
    if (!(scrollOffset + scrollViewHeight == scrollContentSizeHeight)) 
    { 
     [self scrollToBottom]; 
    } else { 
    // bottom reached now stop scrolling 
     shouldScrollToLastRow = false; 
    } 
} 
相關問題