2

我正在尝试从 MvxCollectionViewController 中提供页眉和页脚视图,但遇到了麻烦。通常,使用 UICollectionViewController,我会像这样覆盖 GetViewForSupplementaryElement 方法:

public override UICollectionReusableView GetViewForSupplementaryElement (UICollectionView collectionView, NSString elementKind, NSIndexPath indexPath)
{
    var someHeaderOrFooterView = (HeaderOrFooterView) collectionView.DequeueReusableSupplementaryView (elementKind, elementId, indexPath);
    return someHeaderOrFooterView;
}

MvxCollectionViewControllers 似乎没有像 UICollectionViewController 那样获得对 GetViewForSupplementaryElement 方法的委托回调。

是否有另一种方法可以使用 MvxCollectionViewController 指定 CollectionView 的页眉和页脚?

4

3 回答 3

6

标准步骤应该有效(他们在这里工作......):

  1. 为布局中的标题提供大小

        HeaderReferenceSize = new System.Drawing.SizeF(100, 100),
    
  2. 为标题实现一个类

    public class Header : UICollectionReusableView
    {
        UILabel label;
    
        public string Text
        {
            get { return label.Text; }
            set { label.Text = value; SetNeedsDisplay(); }
        }
    
        [Export("initWithFrame:")]
        public Header(System.Drawing.RectangleF frame)
            : base(frame)
        {
            label = new UILabel() { Frame = new System.Drawing.RectangleF(0, 0, 300, 50), BackgroundColor = UIColor.Yellow };
            AddSubview(label);
        }
    }
    
  3. 注册那个类

       CollectionView.RegisterClassForSupplementaryView(typeof(Header), UICollectionElementKindSection.Header, headerId); 
    
  4. 实现 GetViewForSupplementaryElement

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

刚刚在这里测试了这些步骤,它们在我的示例应用程序中工作(基于https://github.com/slodge/NPlus1DaysOfMvvmCross/tree/master/N-11-KittenView_Collections)。


Aside> 提供可绑定的补充视图存在一个未解决的问题 - https://github.com/slodge/MvvmCross/issues/339 - 但此问题不应影响基本的集合视图操作。

于 2013-09-18T06:48:01.447 回答
1

我在使用 MvvmCross 时遇到了同样的问题,MvxCollectionViewController 从不调用

公共覆盖 UICollectionReusableView GetViewForSupplementaryElement

我使用“Perfem_element”的答案解决了这个问题。

public class MyCollectionViewSource: MvxCollectionViewSource
{

public MyCollectionViewSource(UICollectionView collectionView, NSString defaultCellIdentifier) : base(collectionView, defaultCellIdentifier)
{
}

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

最后在 MvxViewController 中:

var source = new MyCollectionViewSource (CollectionView, ListadoCollectionCell.Key);

谢谢

于 2015-03-11T14:23:06.687 回答
0

我在使用 MvvmCross 时遇到了同样的问题。我能够通过继承 MvxCollectionViewSource 类并覆盖 GetViewForSupplementaryElement 方法来解决它:

public class MyCollectionViewSource: MvxCollectionViewSource
{
    public TimelineSource(UICollectionView collectionView, NSString defaultCellIdentifier) : base(collectionView, defaultCellIdentifier)
    {
    }

    public override UICollectionReusableView GetViewForSupplementaryElement(UICollectionView collectionView, NSString elementKind, NSIndexPath indexPath)
    {
        var headerView = (MyHeader)collectionView.DequeueReusableSupplementaryView(elementKind, MyHeader.Key, indexPath);
        headerView.Text = "Supplementary View";
        return headerView;
    }
}
于 2013-11-24T22:01:59.293 回答