2015-09-30 2 views
1

Я пытаюсь установить UICollectionView в рамках существующего UIViewController. Все работает, за исключением получения названия для каждого раздела - я не могу понять, что я делаю неправильно.GetViewForSupplementaryElement не получает вызов при попытке показать заголовок в UICollectionView

Мой код в UIViewController инициировать представление коллекции:

public partial class ViewController : UIViewController 
{ 
    //... 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     CollectionView_Outlet.RegisterClassForCell(typeof(ModifierCell), ModifierCell.CellID); 
     CollectionView_Outlet.RegisterClassForSupplementaryView (typeof(Header), UICollectionElementKindSection.Header, Header.HeaderId); 
     CollectionView_Outlet.ShowsHorizontalScrollIndicator = false; 
     CollectionView_Outlet.Source = new ModifiersSource(this); 
     CollectionView_Outlet.BackgroundColor = UIColor.White; 
     CollectionView_Outlet.ReloadData(); 
    } 

    //... 
} 

Затем я создал подкласс UICollectionViewSource:

public class ModifiersSource : UICollectionViewSource 
{ 
    ViewController senderVC; 

    public ModifiersSource(ViewController sender) 
    { 
     senderVC = sender; 
    } 

    public override nint NumberOfSections(UICollectionView collectionView) 
    { 
     return 2; 
    } 

    public override nint GetItemsCount (UICollectionView collectionView, nint section) 
    { 
     return senderVC.modifiers.Count; 
    } 

    public override UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath) 
    { 
     //... 
    } 


    public override UICollectionReusableView GetViewForSupplementaryElement(UICollectionView collectionView, NSString elementKind, NSIndexPath indexPath) 
    { 
     var headerView = (Header)collectionView.DequeueReusableSupplementaryView (elementKind, Header.HeaderId, indexPath); 
     headerView.Text = "Supplementary View"; 
     return headerView; 
    } 

} 

И, наконец, создано:

public class Header : UICollectionReusableView 
{ 
    public static NSString HeaderId = new NSString("UserSource1"); 
    UILabel label; 

    public string Text { 
     get { 
      return label.Text; 
     } 
     set { 
      label.Text = value; 
      SetNeedsDisplay(); 
     } 
    } 

    [Export ("initWithFrame:")] 
    public Header (RectangleF frame) : base (frame) 
    { 
     label = new UILabel(){ 
      Frame = new RectangleF(0,0,300,50), 
      BackgroundColor = UIColor.Red}; 
     AddSubview (label); 
     BackgroundColor = UIColor.White; 
    } 
} 

I Положим точку останова на метод GetViewForSupplementaryElement, но он никогда не вызывается. Я также установил следующее в моем раскадровке:

XCode Screenshot

Что мне не хватает ?!

ответ

2

После многих попыток не получить вышеуказанное для работы, я вручную установил UICollectionViewFlowLayout, инициировав UIContainerView. Кажется, сделал трюк, но не уверен, почему он не взял настройки из моего StoryBoard. Вот мой рабочий код:

public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     CollectionView_Outlet.RegisterClassForCell(typeof(ModifierCell), ModifierCell.CellID); 
     CollectionView_Outlet.RegisterClassForCell(typeof(ItemOptionCell), ItemOptionCell.CellID); 
     CollectionView_Outlet.RegisterClassForSupplementaryView (typeof(Header), UICollectionElementKindSection.Header, Header.HeaderId); 
     CollectionView_Outlet.ShowsHorizontalScrollIndicator = false; 

     //This is the new bit I added: 
     var layout = new UICollectionViewFlowLayout(); 
     layout.HeaderReferenceSize = new CGSize (300, 40); 
     CollectionView_Outlet.SetCollectionViewLayout (layout, false); 

     CollectionView_Outlet.Source = new ModifiersSource(this); 
     CollectionView_Outlet.ReloadData(); 
    } 
+0

Это не работает для меня. Я создаю коллекцию в программном виде и устанавливаю headerreferenceisize, а также используя UICollectionViewDelegateFlowLayout и переопределяя GetReferenceSizeForHeader. Даже выполнение этого метода GetViewForSupplementaryElement не вызывается. Все-таки это ошибка в ксамарине? – rbmanian75

1

Чтобы получить эту работу в Xamarin, я должен был включить заголовок раздела под аксессуары (и он врезался в Xamarin, так что с XCode). Я должен был сделать это, даже если я загружаю свой заголовок из отдельного nib/xib в свой вид коллекции (но он также покажет ячейку многократного использования в представлении коллекции, который, как мне кажется, мне не нужен). Очень конкретный, но, надеюсь, это спасет кого-то в подобной ситуации некоторое время!

+0

Хотя это все еще ошибка в Xamarin Studio (6.1.1 - Build 17), вы можете обойти его, но задав размер заголовка на вкладке «Макет». Несмотря на то, что в разделе «Аксессуары» на вкладке «Виджет» параметр «Заголовок заголовка раздела» остается неактуальным, настройка по-прежнему вступает в силу. – DilbertDave