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 处为单元格设置标题