2011-05-16 75 views
30

當用戶滾動到UITableView的底部時,是否有辦法觸發事件(例如使用IBAction)?如果發生這種情況,我想添加更多行。我該怎麼做呢?滾動到底部時將行添加到UITableView

+0

可能重複[\ [iPhone \]如何知道UITableView何時滾動到底部](http://stackoverflow.com/questions/5137943/iphone-how-to-know-when-uitableview-did - 滾動到底部) – 2011-05-16 21:45:14

+0

請在發佈之前搜索。搜索你的標題可以發現我已經鏈接的這個問題,它與Henri給你的答案有相同的信息。 – 2011-05-16 22:50:39

+2

下面是使用Swift的無限UITableView演示:https://github.com/i-schuetz/tableview_infinite它使用異步任務加載數據並顯示加載頁腳。 – Ixx 2014-06-27 19:45:03

回答

38

只需聆聽scrollViewDidScroll:委託方法,將內容偏移量與當前可能的偏移量進行比較,如果低於某個閾值,則調用您的方法更新tableview。不要忘記撥打[tableView reloadData]以確保它重新加載新添加的數據。

編輯:放在一起抽象的代碼,不知道它是否工作,但應該。

- (void)scrollViewDidScroll: (UIScrollView *)scroll { 
    // UITableView only moves in one direction, y axis 
    CGFloat currentOffset = scroll.contentOffset.y; 
    CGFloat maximumOffset = scroll.contentSize.height - scroll.frame.size.height; 

    // Change 10.0 to adjust the distance from bottom 
    if (maximumOffset - currentOffset <= 10.0) { 
      [self methodThatAddsDataAndReloadsTableView]; 
    } 
} 
+0

介意顯示一些碼? – aherlambang 2011-05-16 21:43:10

+0

沒有項目atm來快速顯示內容。我認爲你的viewController是tableView的委託。如果是這樣,只需將scrollViewDidScroll:添加到viewController並將其用作觸發更新方法的地方。將contentOffset.y與最大值(contenSize.y - tableView.frame.size.height)進行比較應該非常簡單。 – 2011-05-16 21:45:23

+0

關鍵是要認識到UITableView是UIScrollView的子類,它也傳遞委託方法。 – 2011-05-16 21:46:33

0

我不知道你爲什麼想這樣做,但我想你可以在cellForRowAtIndexPath方法中添加一些代碼,這樣如果indexPath.row ==最後一行,調用方法來添加更多行。 ..

+4

,因爲我想調用一個REST Web服務來添加更多的行,因爲用戶可以看到更多的條目,而不是「加載更多文章」類的東西,爲什麼不自動執行 – aherlambang 2011-05-16 21:42:57

57

除非這有點晚了,但我想我找到了一個更好的解決方案:

,而不是

- (void)scrollViewDidScroll: (UIScrollView)scroll 

我用

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 

這是方便多了,導致事件只觸發一次。 我在我的應用程序中使用此代碼在底部的tableview中加載更多行(也許您從Facebook應用程序識別此類重新加載 - 只是它們在頂部更新的區別)。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {  
    NSInteger currentOffset = scrollView.contentOffset.y; 
    NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height; 

    if (maximumOffset - currentOffset <= -40) { 
     NSLog(@"reload"); 
    } 
} 

希望任何人都會對此有所幫助。

+0

這是我只需要打一個電話給我的服務器。 ' - (void)scrollViewDidScroll:'被觸發多次以致呼叫你的服務器。除非你按照@Henri Normak的建議在他的評論中提出並添加更新檢查。這很簡單。謝謝@ user944351 – Ben 2013-11-26 03:46:13

+0

很好的解決方案。 +1謝謝 – 2014-01-03 18:59:27

+0

這是最好的解決方案。乾淨的代碼,沒有ivar – OMGPOP 2014-02-26 09:05:03

1
NSInteger currentOffset = scrollView.contentOffset.y; 
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height; 

// Hit Bottom? 
if ((currentOffset > 0) && (maximumOffset - currentOffset) <= 10) { 
    // Hit Bottom !! 
} 
1

它可以更簡單的方式來實現我猜,你只需要確定的滾動方向在這種情況下,當用戶滾動向下它。

首先在.h文件中聲明一個變量:

CGPoint pointNow; 

在.m文件,在scrollViewDidScroll方法,我們需要實現這個代碼: -

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (scrollView.contentOffset.y > pointNow.y) { 
     //Enter code here 
    } 
} 
14

我用這個片段。在tableView:willDisplayCell:forRowAtIndexPath:我檢查,如果具有最後索引路徑的單元格即將顯示。

對於一個路段的的tableView:

[indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:0] 

與多個部分:

[indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:[self numberOfSectionsInTableView:self.tableView]-1] 

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(!_noMoreDataAvailable) 
    { 
     if ([indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:0]]) 
     { 
      [self.dataSourceController fetchNewData]; 
     } 
    } 
} 

獲取的dataSourceController將通知的tableView委託,這將重新加載數據後。

+2

輝煌的答案,更喜歡此相比scrollViewDidScroll選項 - 感謝vikingosegundo! – Rob 2014-01-16 14:00:07

+0

如果使用加載或錯誤單元格,請確保有一個如下所示的小檢查:if(indexPath.row> 5)或簡單地將boolean noMoreDataAvailble設置爲false。 – 2014-04-18 14:12:54

+0

如果您希望在用戶進入最後一個單元格之前稍微加載數據,那就不太好了。當您在 – Tander 2015-04-30 11:01:10

1

斯威夫特

這裏是@user944351's answer雨燕版本:

func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) { 

    let currentOffset = scrollView.contentOffset.y 
    let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height 

    if maximumOffset - currentOffset <= -40 { 
     print("reload") 
    } 
} 

就在這個方法添加到您的UITableView委託類。我發現-40太大,但您可以根據自己的需要進行調整。

更多信息

  • 參見my fuller answer具有方法的示例重新加載使用用於數據庫限制和偏移數據。
相關問題