【发布时间】:2014-02-07 09:55:23
【问题描述】:
我有一个UICollectionView,我需要从中独立收听滚动和选择事件。我将Delegate 和Scrolled 事件处理程序分配如下:
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 属性,这是一个仅实现collectionView:didSelectItemAtIndexPath: 的NSObject 子类。
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 使应用程序崩溃(可能我使用了错误的键路径名)。
【问题讨论】:
标签: c# xamarin.ios xamarin uicollectionview