首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UICollectionViewDelegate清除事件处理程序(反之亦然)

UICollectionViewDelegate清除事件处理程序(反之亦然)
EN

Stack Overflow用户
提问于 2014-02-06 20:51:22
回答 1查看 1.4K关注 0票数 6

我有一个UICollectionView,我需要独立地听滚动和选择事件。我按照以下方式分配DelegateScrolled事件处理程序:

代码语言:javascript
复制
public override void ViewWillAppear(bool animated)
(
    base.ViewWillAppear(animated);
    this.CollectionView.Delegate = this.CollectionViewDelegate;
    this.CollectionView.Scrolled += HandleCollectionViewScrolled;
}

但是,在分配事件处理程序之后,将不再调用委托方法。并扭转这种局面:

代码语言:javascript
复制
public override void ViewWillAppear(bool animated)
(
    base.ViewWillAppear(animated);
    this.CollectionView.Scrolled += HandleCollectionViewScrolled;
    this.CollectionView.Delegate = this.CollectionViewDelegate;
}

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

考虑到强类型委托对所有方法的必要实现可能会删除事件处理程序,我尝试分配WeakDelegate属性,它是一个只实现collectionView:didSelectItemAtIndexPath:NSObject子类。

代码语言:javascript
复制
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会使应用程序崩溃。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-07 00:01:28

简短回答:

这是故意的。.NET事件是通过使用内部*Delegate实现来实现的(没有其他方法提供它们)。

因此,您不能在不禁用任何现有事件的情况下设置自己的*Delegate

长答案:

这是我的blog post,描述了这一点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21613789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档