CollectionViewController,我应该使用普通的 UIViewController 子类化或实现它的委托/数据源吗?

Posted

技术标签:

【中文标题】CollectionViewController,我应该使用普通的 UIViewController 子类化或实现它的委托/数据源吗?【英文标题】:CollectionViewController, should I subclass or implement its delegate/datasource with a normal UIViewController? 【发布时间】:2015-01-17 03:26:29 【问题描述】:

当我使用CollectionView 实现viewController 时,是否应该从storyBoard 中拖放一个CollectionViewController 然后创建一个MyCollectionViewController 类,它是CollectionViewController 的子类?

或者我应该只使用一个普通的 viewController,向它添加一个集合视图,并实现它的 dataSource 和委托协议吗?

我知道以后的好处之一是您可以在一个ViewController 下有多个CollectionViews?但是还有什么其他优点和缺点?

以及它如何应用于TableViewController,因为它们彼此非常相似。

【问题讨论】:

【参考方案1】:

UICollectionViewController 继承自 UIViewController,因此它本质上是一个带有 UICollectionView 和一些内置功能的 UIViewController。根据文档,此功能是:

如果集合视图控制器有一个指定的 nib 文件或者是 从情节提要加载,它从相应的笔尖加载其视图 文件或故事板。如果您创建集合视图控制器 以编程方式,它会自动创建一个新的未配置的 集合视图对象,您可以使用 collectionView 访问该对象 属性。

从情节提要或 nib 文件加载集合视图时,数据 集合视图的源和委托对象是从 笔尖文件。如果未指定数据源或委托,则 集合视图控制器将自己分配给未指定的角色。

当collection view第一次出现时, 集合视图控制器重新加载集合视图数据。它也是 每次显示视图时清除当前选择。你可以 通过设置 将SelectionOnViewWillAppear 属性清除为NO。

我更喜欢始终继承 UIViewController 并在情节提要中添加 UICollectionView。这意味着我的子类必须实现 UICollectionViewDataSource 和 UICollectionViewDelegate 协议,并且我必须在情节提要中设置它们,并且我必须确保当视图控制器出现时我重新加载集合视图。但是因为我自己实现了这个行为,所以感觉我有更多的控制权。如果您倾向于使用常规的默认行为,那么也许可以使用 UICollectionViewController 以节省时间。

我对带有 UITableView 的 UITableViewController 和 UIViewController 的感觉完全一样——出于完全相同的原因,我更喜欢后者。

【讨论】:

【参考方案2】:

如果您确定您的 UI 将只有 CollectionView,请使用 CollectionViewController

这条规则也适用于tableViews

【讨论】:

【参考方案3】:

就我个人而言,我开始总体上采用不同的方法。我使用普通的 UIViewController 来添加 UITableView 或 UICollectionView。在控制器中,我只为视图创建一个 IBOutlet。

class MyViewController: UIViewController 
    @IBOutlet weak var tableView: UITableView!

接下来我创建一个单独的对象作为我的数据源

class MyDataSource: NSObject, UITableViewDataSource 
    init(with tableView: UITableView)
        //Register cells, configure tableview, etc
    
    numberOf...
    cellForRowAt...

然后在我的视图控制器中,我有一个带有数据源的惰性变量:

lazy var dataSource: MyDataSource =  return MyDataSource(with: self.tableView) ()

最后在 viewDidLoad 中,我将数据源设置为 tableview:

tableView.dataSource = dataSource

通过这样做,您可以让您的视图控制器真正干净和小巧。您防止 MVC(大规模视图控制器)问题并遵循单一职责的原则。此外,您的数据源现在可以跨多个视图控制器重用。

【讨论】:

以上是关于CollectionViewController,我应该使用普通的 UIViewController 子类化或实现它的委托/数据源吗?的主要内容,如果未能解决你的问题,请参考以下文章

过渡到其他collectionviewController时collectionviewCell不会改变

如何从集合视图单元格中调用CollectionViewController

如何在 CollectionViewController 中为 gif 设置动画.. (Objective-C)

CollectionViewControllerCell的问题没有显示CollectionViewController

CollectionViewController,我应该使用普通的 UIViewController 子类化或实现它的委托/数据源吗?

并非所有单元格都显示在 CollectionViewController Swift 中