2012-02-27 75 views
7

我有一個MonoTouch iPhone應用程序,它有一個UITableViewController,因爲它是主視圖控制器。MonoTouch - 檢測UITableView滾動

我想要當的tableview正在與代碼滾動檢測:

this.TableView.Scrolled += TableViewScrolled; 

其中TableViewScrolled(object sender, EventArgs e) { }被稱爲我的方法。 但由於某種原因未能致電TableViewScrolled()

有沒有人有這方面的經驗?

回答

6

@在克魯梅爾爾的評論以前的答案是非常好的一點,國際海事組織應該是一個答案(不是評論)。

問題是,如果您將Delegate(或WeakDelegate)設置爲您的UITableView,那麼它的事件將不再起作用。

爲什麼?,因爲爲了實現這些事件,MonoTouch爲UIScrollView(其父代UITableView)創建了它自己的內部代理類型,它覆蓋了代理的方法並將它們公開爲更多自然(在.NET中),類型內的事件。

這實際上意味着您不能將這些UITableView事件與您自己的代理UITableViewDelegate類型混合(因爲後者將覆蓋前者)。

3

閱讀本文件:UIScrollViewDelegate

您可以使用:

- (void) scrollViewDidScroll:(UIScrollView *)scrollView { 


} 

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView { 


} 

祝你好運, 彌敦道

+1

這些是在MonoTouch中映射到UITableView.Scrolled的方法;什麼是爲什麼我想這個.TableView.Scrolled + = TableViewScrolled;應該做的伎倆。但是不行。 :-) – Brett 2012-02-27 01:33:48

+3

你使用委託嗎?如果你這樣做,回調不起作用。如果您使用回調,委託不起作用。它是或者。 – Krumelur 2012-02-27 08:27:49

+1

@Nathan這是一個關於Xamarin的問題,它被稱爲Scrolled()。 – 2013-04-22 15:36:23

13

我的回答是實際上不是隻有滾動,但由於事實,我已經花了相當一個小時所造成的滾動事件的問題戰鬥,我決定寫回答這裏。

所以,對我來說,問題是,訂閱後:

this.myTableView.Scrolled += (sender, args) => 
    { 
     ... 
    }; 

我從UITableViewDataSource類繼承重寫的方法:

public override UIView GetViewForHeader(UITableView tableView, int section) 
    public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath) 

停止工作(變成不叫)。這是...顯然,非常意外!

所以,我只是不得不重寫

public override void Scrolled(UIScrollView scrollView) 

在同一個數據源代表,而不是訂閱對錶視圖存在的事件。

我希望有人不會遇到這樣的麻煩!

+0

謝謝你的建議! – DeeRain 2013-07-16 12:10:05

+0

嗨我有一個DialogViewController同樣的問題(從Monotouch MTD)。就我而言,只要我開始處理滾動的事件,我的細胞上所有點擊事件就停止工作。由於UITableViewDataSource是由框架動態創建的,你知道如何重寫Scrolled方法而不是處理事件。 – 2013-09-17 16:58:36

+0

關於實現(覆蓋)自己的數據源有什麼用?另一種選擇是直接從Window類處理(如果需要)所有事件。 – Agat 2013-09-17 20:25:36