2012-02-27 78 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