为什么我的自定义UICollectionViewController的GetCell方法没有被调用

时间:2016-05-27 12:04:56

标签: xamarin.ios storyboard uicollectionview

我的故事板设置如下:

enter image description here

如你所见,我有一个主屏幕。它可以访问导航控制器。它有两个ContainerView,一个用作侧窗,另一个用作主要内容。我计划在需要时将内容交换到这个主内容容器中。

我希望在此容器中显示的一件事是,从侧窗选择它时,是一个显示人物的单元格的CollectionView。每个单元格都有一张照片和人员的详细信息。

我可以为CollectionView找到的最佳代码示例是Xamarin StateRestoration示例项目。它包括一个故事板。在我自己的特定故事板上工作时,我尽可能地遵循了食谱。

问题现在是用于填充CollectionView中每个单元格的GetCell(UICollectionView collectionView, NSIndexPath indexPath)方法未被调用。据我所知,我应该实例化CollectionViewController的数据源属性。我已经在AppDelegate和我的CollectionViewController本身的ViewDidLoad中尝试了这个,并且GetCell仍未被调用。这是为什么?

任何帮助表示赞赏!如果您需要更多信息,请让我编辑。

1 个答案:

答案 0 :(得分:1)

您需要设置数据源和委托。正如您所提到的,您已经设置了数据源。要设置委托在xcode中打开故事板,请选择UICollectionView并控制拖动到其父视图控制器。看看这个gif。

enter image description here

还要确保在目标视图控制器中实现IUICollectionViewSource接口

public partial class DetailViewController : UIViewController, IUICollectionViewSource
    {

        protected DetailViewController(IntPtr handle) : base(handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }


        public nint GetItemsCount(UICollectionView collectionView, nint section)
        {
            return 10;
        }

        public UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath)
        {
            var cell = collectionView.DequeueReusableCell("PersonCell", indexPath) as UICollectionViewCell;
            return cell;
        }
    }

编辑1:

您也可以通过编程方式执行此操作。输入故事板,在窗口小部件属性中设置UICollectionView - PersonCollection的名称。然后在视图控制器后面的代码覆盖ViewDidLoad并设置WeakDelegateWeakDataSource(弱,因为我们绝对不想为iOS创建循环引用和内存泄漏)

public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            PersonCollection.WeakDataSource = this;
            PersonCollection.WeakDelegate = this;
        }

希望这有帮助!