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

时间:2015-01-17 03:26:29

标签: ios objective-c uitableview uiviewcontroller uicollectionview

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

  

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

     

从故事板或nib文件加载集合视图时,数据   集合视图的源和委托对象是从中获取的   nib文件。如果未指定数据源或委托,则   集合视图控制器将自己分配给未指定的角色。

     

当集合视图第一次出现时,   集合视图控制器重新加载集合视图数据。它也是   每次显示视图时清除当前选择。您可以   通过设置的值来更改此行为   clearsSelectionOnViewWillAppear属性为NO。

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

我对使用UITableView的UITableViewController和UIViewController感觉完全相同 - 我更喜欢后者,原因完全相同。

答案 1 :(得分:0)

如果您确定自己的用户界面只有CollectionView,请使用CollectionViewController

此规则也适用于tableViews

答案 2 :(得分:0)

就个人而言,我开始采用不同的方法。我使用普通的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...
}

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

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

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

tableView.dataSource = dataSource

通过执行此操作,您可以保持视图控制器非常干净和小巧。您可以防止MVC(大规模视图控制器)问题并遵循单一职责原则。此外,您的数据源现在可以跨多个视图控制器重复使用。