2014-02-06 31 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描述這一點。