gpt4 book ai didi

c# - Xamarin - 分配 UICollectionViewDelegate 会清除事件处理程序(反之亦然)

转载 作者:太空狗 更新时间:2023-10-29 21:39:26 27 4
gpt4 key购买 nike

我有一个 UICollectionView,我需要从中独立地监听滚动和选择事件。我分配 DelegateScrolled 事件处理程序如下:

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

但是,在我分配事件处理程序之后,委托(delegate)方法不再被调用。并反转它们:

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

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

考虑到强类型委托(delegate)对所有方法的必要实现可能会消除事件处理程序,我尝试分配 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.");
}
}

但同样,我得到了相同的结果:只有事件处理程序或委托(delegate)触发。还有其他人经历过吗?这是 Xamarin 的问题吗?我希望设置弱委托(delegate)不应该一定会清除事件处理程序。

还值得注意的是,作为解决方法,我尝试使用 KVO。但是,当我尝试观察 Collection View 的 contentOffset 属性时,KVO 使应用程序崩溃(也许我使用了错误的关键路径名称)。

最佳答案

简答:

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

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

长答案:

这是我的 blog post描述这个。

关于c# - Xamarin - 分配 UICollectionViewDelegate 会清除事件处理程序(反之亦然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21613789/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com