UICollectionView 包裹在 UIViewController 中

Posted

技术标签:

【中文标题】UICollectionView 包裹在 UIViewController 中【英文标题】:UICollectionView wrapped in a UIViewController 【发布时间】:2014-09-02 17:47:11 【问题描述】:

我有一个 UICollectionView,我通过 Storyboard 将其放置在自定义 UIViewController 中,并将其前导/尾随/顶部/底部空间固定到其超级视图。

然后我有一个自定义的UICollectionViewController 子类,它应该使用集合视图。所以在超级视图的UIViewController(PrimaryViewController)中,我有一个集合视图的出口,我实例化了我的自定义UICollectionViewController。我为其分配集合视图,并将自定义 UICollectionViewController 分配为集合视图的委托和数据源。

但是当我运行它时,集合视图不会出现在屏幕上。很明显,viewDidLoad() 没有在自定义 UICollectionViewController 类中被调用,所以要么我错过了一个关键部分,要么我以错误的方式接近它。

谁能告诉我如何在集合视图(通过 Storyboard 放置)和自定义 UICollectionViewController 类(仅代码)之间构建连接,以使其正常工作?

到目前为止,这是我的(简化的)代码...

class PrimaryViewController : UIViewController 
    @IBOutlet private weak var _collectionView:UICollectionView!
    private var _collectionViewCtrl:CustomCollectionViewController!

    override func viewDidLoad() 
        super.viewDidLoad()
        _collectionViewCtrl = CustomCollectionViewController(collectionView: _collectionView)
    



class CustomCollectionViewController : UICollectionViewController 
    init(collectionView:UICollectionView) 
        super.init(nibName: nil, bundle: nil)

        self.collectionView = collectionView
        self.collectionView.delegate = self
        self.collectionView.dataSource = self
    

    required init(coder aDecoder:NSCoder) 
        super.init(coder: aDecoder)
    

    override func viewDidLoad() 
        super.viewDidLoad()
    

【问题讨论】:

为什么不在PrimaryViewController IB 中嵌入CustomCollectionViewController。您可以将UICollectionViewController 添加到UIViewController,然后将其类更改为您的自定义类。 @thelaws 之所以这样,是因为我的 PrimaryViewController 的视图中也有一个工具栏,而不仅仅是集合视图。 【参考方案1】:

在 IB 或 Storyboard 中,您可以使用容器视图并将自定义集合视图控制器嵌入其中。这使您能够在其自己的上下文中操作每个视图控制器,因为它们每个都有自己的nib,并且会自动神奇地处理您的集合视图控制器的实例化。

您的PrimaryViewController 可能如下所示:

class PrimaryViewController : UIViewController 
    @IBOutlet private weak _collectionView: UIView
    private var _collectionViewController: CustomCollectionViewController! 
        // ???: You can also iterate through child view controllers looking for a class match if you embed other controllers.
        return self.childViewControllers[0] as CustomCollectionViewController!
    

    override func viewDidLoad() 
        super.viewDidLoad()
    

这也会在您的CustomCollectionViewController 上调用viewDidLoad()。您可以通过_collectionView属性隐藏和显示视图,也可以通过_collectionViewController直接操作。

痛苦来自任何可能是外观逻辑的逻辑(viewWillAppear(_: Bool)viewWillDisappear(_: Bool) 等),因为您必须自己触发这些逻辑。

您的故事板应该如下所示(我的容器视图已隐藏):

【讨论】:

我会试试这个!我不知道可以在容器中使用 CollectionViewController,我以为只有 UIViews。感谢您指出这一点!【参考方案2】:

请注意,充当UICollectionView 的委托/数据源的对象不必从UICollectionViewController 派生。事实上,除非你在 storyboard 中拖出一个 UICollectionViewController,否则不应该这样。

数据源/委托类应派生自NSObject

@interface CustomCollectionViewSupervisor : NSObject <UICollectionViewDataSource, UICollectionViewDelegate>

并且必须实现数据源/委托方法,包括但不一定限于

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

【讨论】:

但这并不能解决我的问题,即集合视图没有出现。当我注释掉 _collectionViewCtrl = CustomCollectionViewController(collectionView: _collectionView) 行时,collectionView 会正确显示。所以这意味着自定义collectionViewController与collection view没有出现有关。

以上是关于UICollectionView 包裹在 UIViewController 中的主要内容,如果未能解决你的问题,请参考以下文章

检测 UIGestureRecognizer 点击并释放以显示和删除 UIView

如何为自定义 TableViewCell 和 CollectionView Cell 使用一个 UIView。?

RN下ScrollView包裹FlatList/SectionList类的组件,在IOS键盘遮挡问题

如何在 uicollectionview 标题中添加 uicollectionview

无法在 uicollectionview、UICollectionView 的特定 indexPath.row 处为单元格设置标题

折叠UICollectionView