【问题标题】:Xamarin - Assigning UICollectionViewDelegate wipes out event handlers (and vice versa)Xamarin - 分配 UICollectionViewDelegate 清除事件处理程序(反之亦然)
【发布时间】:2014-02-07 09:55:23
【问题描述】:

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

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


    【解决方案1】:

    简答:

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

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

    长答案:

    这是我的 blog post 描述的。

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 2019-11-09
      • 2011-08-07
      • 1970-01-01
      • 2010-10-22
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多