2012-12-09 47 views
7

UICollectionViewDelegateFlowLayout有一個名爲sizeForItem(在MonoTouch中爲GetSizeForItem)的方法。如何在UICollectionViewController中提供GetSizeForItem實現?

但我沒有明確提供委託 - 相反,我從UICollectionViewController繼承。
它混合數據源和委託功能,但沒有此方法覆蓋。

我嘗試添加這對我的控制器:

[Export ("collectionView:layout:sizeForItemAtIndexPath:")] 
public virtual SizeF GetSizeForItem (UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath) 
{ 
    return new SizeF (100, 100); 
} 

,它從未被調用。

如何提供此方法而不訴諸分離委託和數據源?

+0

可以不加這個。在Obj-C中,數據源對象可以採用委託協議。這在Monotouch中不可行。 – svn

+0

@svn:所以唯一的解決方案是擺脫控制器,並使用數據源和委託呢?如果是這種情況,請將其作爲回答發佈,以便我可以接受。 –

+0

您可以在您的子類控制器中定義並分配自定義委託和數據源。這種方式,你可以使用你的自定義控制器形式外部和內部使用您的自定義代表 – svn

回答

11

你不能。在Obj-C中,viewcontroller(或任何類)對象可以採用委託協議。這在Monotouch中不可行。你給了使用委託實例。但是,這可能是一個私有類

public class CustomCollectionViewController:UICollectionViewController 
{ 
    public CustomCollectionViewController():base() 
    { 

     this.CollectionView.Delegate = new CustomViewDelegate(); 

    } 

    class CustomViewDelegate: UICollectionViewDelegateFlowLayout 
    { 

     public override System.Drawing.SizeF GetSizeForItem (UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath) 
     { 
      return new System.Drawing.SizeF (100, 100); 
     } 
    } 
} 
+0

這對我有用,謝謝。 –

+0

但請注意,在這種情況下,像ShouldSelectItem和其他委託方法的方法將在您的委託上調用,而在您的控制器上則不會調用**。 –

+1

這是因爲它應該根據蘋果文檔。 UICollectionViewDelegateFlowLayout繼承了實現這些方法的UICollectionViewDelegate – svn

8

編輯: 而不需要創建一個委託子類的,在你的UICollectionviewSource

/** Other methods such as GetItemsCount(), GetCell()... goes here **/ 

[Export ("collectionView:layout:sizeForItemAtIndexPath:"), CompilerGenerated] 
public virtual CGSize GetSizeForItem (UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath) 
{ 
    return new CGSize (width, height); 
} 
+1

感謝它的工作:) –