2012-12-09 9 views
7

UICollectionViewDelegateFlowLayout hat eine Methode namens sizeForItem (GetSizeForItem in MonoTouch).Wie kann ich die GetSizeForItem-Implementierung in UICollectionViewController bereitstellen?

Aber ich stelle den Delegaten nicht explizit zur Verfügung - stattdessen erben ich von UICollectionViewController.
Sie mischt die Datenquelle und die Delegatfunktionalität, verfügt jedoch nicht über diese Methode zum Überschreiben.

Ich habe versucht, diese zu meinen Controller:

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

und es wurde nie genannt.

Wie stelle ich diese Methode zur Verfügung, ohne Trennung von Delegaten und Datenquelle zu verwenden?

+0

Sie können nicht. In Obj-C kann das Datenquellenobjekt das Delegate-Protokoll übernehmen. Dies ist in Monotouch nicht möglich. – svn

+0

@svn: Also die einzige Lösung ist, den Controller loszuwerden und Datenquelle zu verwenden und delegieren stattdessen? Wenn dies der Fall ist, bitte posten Sie es als Antwort, damit ich es akzeptieren kann. –

+0

Sie könnten benutzerdefinierte Delegaten und Datenquellen innerhalb Ihres untergeordneten Controllers definieren und zuweisen. Auf diese Weise können Sie einfach Ihren benutzerdefinierten Controller von außen verwenden und intern Ihre benutzerdefinierten Delegaten verwenden. – svn

Antwort

11

Sie können nicht. In Obj-C kann der Viewcontroller (oder eine beliebige Klasse) das Delegate-Protokoll übernehmen. Dies ist in Monotouch nicht möglich. Sie haben angegeben, eine Delegateninstanz zu verwenden. Aber dies ist eine private Klasse sein kann

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

Das funktionierte für mich, danke. –

+0

Beachten Sie jedoch, dass in diesem Fall Methoden wie 'ShouldSelectItem' und andere Delegate-Methoden auf Ihrem Delegaten und ** nicht ** auf Ihrem Controller aufgerufen werden. –

+1

Welches ist wie es sollte nach den Apple Docs sein. UICollectionViewDelegateFlowLayout erbt UICollectionViewDelegate, das diese Methoden implementiert – svn

8

Edit: Ohne die Notwendigkeit eines Delegierten Unterklasse zu schaffen, fügen Sie diese in Ihrem 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

Danke es funktioniert gut :) –