2012-07-10 102 views
7

我有一個應用程序,其中我有一個UITableView一個UIView,這又是一個UIScrollView內內,所以層級變成這樣:爲什麼UITableView調用UIScrollView的委託方法?

UIScrollView - >UIView - >UITableView

內部數據我UITableView填寫正確。

現在,我的問題是,當我滾動我的UITableView時,代理方法scrollViewDidEndDecelerating:scrollViewDidEndDragging::被調用。

我不想要這種行爲,應該怎麼做才能阻止這種行爲?

任何一個請幫助, 預先感謝!

+0

如果我正確理解你,你有2個滾動視圖,因爲UITable已經坐在滾動視圖上。這可能會導致問題。 – geminiCoder 2012-07-10 10:13:56

+0

不,我已經保留[parentScroll setScrollEnabled:NO] ...所以這不是問題... – 2012-07-10 10:16:34

+0

確定在這種情況下,我明白爲什麼這會混淆,讓我想一想 – geminiCoder 2012-07-10 10:21:28

回答

8

UITableViewDelegate擴展了UIScrollViewDelegate。因此調用委託方法。

阻止這個你可以設置tableView.tag = 1000;當你的頁頭和的tableView在UIScrollViewDelegate方法(scrollViewDidEndDecelerating: and scrollViewDidEndDragging::)添加這個在很begining:

if(scrollView.tag == 1000) 
    return; 
+1

...或者將一個指向表格視圖的指針保存爲一個ivar並與之相比較。 – 2012-07-10 12:02:37

+0

爲真。我使用標籤來最小化指針的使用。不是我害怕他們,但IMO使用autorelease和標籤使得代碼不易受內存泄漏的影響。 – George 2012-07-10 13:07:52

+0

我使用指針是因爲標籤可能不是唯一的非理性擔心!啞在這種情況下,我知道... – 2012-07-10 13:39:13

3

因爲UITableView的UIScrollView的從繼承。因此它顯示了UIScrollView的所有屬性和行爲。如果你不想要這個,那麼請做一件事。

假設您的頁面中有另一個滾動視圖。

viewDidLoadXIB(如果你在XIB中有你的tableview),爲你的tableview設置一個標籤。

代碼,

self.objYourTableView.tag = 101; 

然後在滾動視圖代表

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 
    { 
     if(!(scrollView.tag == 101)) 
     { 
      // Go for your code to run. 
     } 
    } 

所以你的代碼將跳過如果通過表視圖調用。其他情況下,它是完美的。希望這會幫助你。

+1

'因爲UITableView繼承自UIScrollView'。不是。因爲'因爲UITableViewDelegate從UIScrollViewDelegate繼承'。 – George 2012-07-10 13:09:01