2014-02-06 30 views
6

我有一个UICollectionView,我需要从中独立地收听滚动和选择事件。我分配DelegateScrolled事件处理程序如下:Xamarin - 分配UICollectionViewDelegate消除事件处理程序(反之亦然)

public override void ViewWillAppear(bool animated) 
(
    base.ViewWillAppear(animated); 
    this.CollectionView.Delegate = this.CollectionViewDelegate; 
    this.CollectionView.Scrolled += HandleCollectionViewScrolled; 
} 

然而,当我指定事件处理程序,委托方法不再被调用。并扭转他们:

public override void ViewWillAppear(bool animated) 
(
    base.ViewWillAppear(animated); 
    this.CollectionView.Scrolled += HandleCollectionViewScrolled; 
    this.CollectionView.Delegate = this.CollectionViewDelegate; 
} 

产生完全相反的结果(委托方法的工作,但没有滚动监听器)。

思考的是,强类型委托的所有方法必要的实施可能会被抹了事件处理程序的时候,我试着而不是分配WeakDelegate属性,它是一个NSObject子类,只实现collectionView:didSelectItemAtIndexPath:

public class MyCollectionViewDelegate : NSObject 
{ 
    public MyCollectionViewDelegate() : base() 
    { 
    } 

    [Export ("collectionView:didSelectItemAtIndexPath:")] 
    public void ItemSelected(UICollectionView collectionView, MonoTouch.Foundation.NSIndexPath indexPath) 
    { 
     Console.WriteLine("It worked."); 
    } 
} 

但是,我得到了同样的结果:只有事件处理程序或委托触发。有没有其他人经历过这个?这是Xamarin的问题吗?我期望设置弱代表不应该必然会消除事件处理程序。

值得一提的是,作为解决方法,我尝试使用KVO。但是,当我尝试观察集合视图的contentOffset属性(也许我使用错误的键路径名称)时,KVO崩溃了应用程序。

回答

5

答案很简单:

这是由设计。 .NET事件通过使用内部*Delegate实现来实现(没有其他方法可以提供它们)。

因此,您不能设置自己的*Delegate而不禁用任何现有事件。

龙答:

这里是我的blog post描述这一点。