使用 xib 子类化 UICollectionViewController

Subclass UICollectionViewController with xib

我正在尝试创建自定义 UICollectionViewController 子class。

我使用 Xcode 的向导创建了它:

点击 Finish 后,我得到了这个 .xib 文件:

当我尝试像这样从另一个 class 调用它时:

MyCollectionViewController *myCollectionViewController = [MyCollectionViewController new];

[self addChildViewController:myCollectionViewController];

[self.view addSubview:myCollectionViewController.view];

我收到这个错误:

UICollectionView must be initialized with a non-nil layout parameter

如果我使用:

MyCollectionViewController *myCollectionViewController = [[MyCollectionViewController alloc] initWithCollectionViewLayout:[UICollectionViewFlowLayout new]];

它没有崩溃,但有一些问题:

  1. 如果 .xib 文件中已经存在,为什么还需要 CollectionViewLayout
  2. 我不想在 MyCollectionViewController 之外创建布局;在这种情况下,subclassing 的目的是什么?
  3. 整个视图显示为空白。

如果在 xib 中指定了视图控制器的 UI,那么您必须通过调用 [[MyCollectionViewController alloc] initWithNibName:@"MyCollectionViewController" inBundle:[NSBundle mainBundle]] 来实例化它(或者您得到您的包)。当您使用此构造函数时,视图控制器的插座会正确连接,并且布局会根据 xib 中的内容进行设置。

XIB 大部分 是老式的,对于视图控制器来说更是如此。将它们用于视图,或有时用于单元格。由于您正在创建视图控制器,因此请改用故事板。这有一些优点:您可以在故事板中配置 VC(及其视图);您可以使用自动布局;并且你可以将相关的视图控制器放在同一个故事板中。

打开故事板文件,拖出一个新的 UIViewController(在本例中为 UICollectionViewController),然后在第三个属性选项卡(通常在右侧)上,设置您的自定义 class.