2012-12-09 18 views
7

UICollectionViewDelegateFlowLayout có phương pháp được gọi là sizeForItem (GetSizeForItem trong MonoTouch).Làm cách nào tôi có thể cung cấp triển khai GetSizeForItem trong UICollectionViewController?

Nhưng tôi không cung cấp cho đại biểu một cách rõ ràng — thay vào đó, tôi kế thừa từ UICollectionViewController.
Nó kết hợp nguồn dữ liệu và chức năng ủy nhiệm nhưng không có phương pháp này để ghi đè.

Tôi đã cố gắng thêm này để điều khiển của tôi:

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

và nó chưa từng được gọi.

Làm cách nào để cung cấp phương pháp này mà không cần phải tách biệt đại biểu và nguồn dữ liệu?

+0

Bạn không thể. Trong Obj-C đối tượng nguồn dữ liệu có thể áp dụng giao thức đại biểu. Đây không phải là posible trong Monotouch. – svn

+0

@svn: Vậy giải pháp duy nhất là loại bỏ bộ điều khiển và sử dụng nguồn dữ liệu và ủy quyền thay thế? Nếu đây là trường hợp, xin vui lòng gửi nó như là một câu trả lời vì vậy tôi có thể chấp nhận nó. –

+0

Bạn có thể xác định và gán cho bạn đại biểu tùy chỉnh và nguồn dữ liệu bên trong bộ điều khiển được phân lớp của bạn. Bằng cách này bạn chỉ có thể sử dụng biểu mẫu tùy chỉnh của bạn bên ngoài và bên trong sử dụng các đại biểu tùy chỉnh của bạn – svn

Trả lời

11

Bạn không thể. Trong Obj-C đối tượng viewcontroller (hoặc bất kỳ lớp nào) có thể áp dụng giao thức ủy nhiệm. Đây không phải là posible trong Monotouch. Bạn đã sử dụng một cá thể đại biểu. Nhưng điều này có thể là một lớp riêng

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

Điều này làm việc cho tôi, cảm ơn bạn. –

+0

Lưu ý rằng, trong trường hợp này, các phương thức như 'ShouldSelectItem' và các phương thức ủy nhiệm khác sẽ được gọi trên đại biểu của bạn và ** not ** trên bộ điều khiển của bạn. –

+1

Đó là như nó phải được theo các tài liệu táo. UICollectionViewDelegateFlowLayout kế thừa UICollectionViewDelegate thực hiện các phương thức đó – svn

8

Edit: Nếu không có nhu cầu tạo một lớp con đại biểu, thêm này trong UICollectionviewSource bạn

/** 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

Cảm ơn bạn đã làm việc tốt :) –

Các vấn đề liên quan