2012-12-09 12 views
7

UICollectionViewDelegateFlowLayout ma metodę o nazwie sizeForItem (GetSizeForItem w MonoTouch).Jak mogę zapewnić implementację GetSizeForItem w UICollectionViewController?

Ale nie przekazuję delegata jawnie - zamiast tego, dziedziczę po UICollectionViewController.
Łączy źródło danych i funkcje delegowania, ale nie ma tej metody do przesłonięcia.

Próbowałem dodanie tego do mojego kontrolera:

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

i nigdy nie został powołany.

Jak zapewnić tę metodę bez konieczności oddzielania delegata i źródła danych?

+0

Nie możesz. W Obj-C obiekt źródła danych może przyjąć protokół delegata. To nie jest możliwe w Monotouch. – svn

+0

@svn: A więc jedynym rozwiązaniem jest pozbycie się kontrolera i użycie źródła danych zamiast delegowania? Jeśli tak jest, opublikuj go jako odpowiedź, aby móc go zaakceptować. –

+0

Możesz zdefiniować i przypisać Ci niestandardowego delegata i źródło danych w swoim podklasowanym kontrolerze. W ten sposób możesz po prostu użyć swojego kontrolera customcontroller na zewnątrz i wewnętrznie użyć swoich niestandardowych delegatów. – svn

Odpowiedz

11

Nie możesz. W Obj-C obiekt viewcontroller (lub dowolna klasa) może przyjąć protokół delegata. To nie jest możliwe w Monotouch. Dałeś użyć instancji delegata. Ale może to być prywatnym klasa

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

To zadziałało dla mnie, dziękuję. –

+0

Pamiętaj jednak, że w tym przypadku metody takie jak 'ShouldSelectItem' i inne metody delegatów będą wywoływane na twoim uczestniku i ** nie ** na twoim kontrolerze. –

+1

Co jest zgodne z zaleceniami Apple Docs. UICollectionViewDelegateFlowLayout dziedziczy UICollectionViewDelegate, który implementuje te metody. – svn

8

EDIT: bez potrzeby tworzenia podklasy delegata, dodać to w 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

Dzieki temu działa dobrze :) –