1

當我使用CollectionView實現viewController時,是否應該從storyBoard中拖放一個CollectionViewController然後創建一個MyCollectionViewController類,該類是CollectionViewController的子類?CollectionViewController,我應該使用普通的UIViewController繼承或實現它的委託/數據源嗎?

,或者我應該只使用一個普通的viewController,添加集合視圖它,並執行其DataSource和委託協議?

我知道以後的一個優點是您可能有多個CollectionViews下一個ViewController?但是,其他的利弊呢?

它如何適用於TableViewController,因爲它們非常相似對方。

回答

1

UICollectionViewController從UIViewController的繼承,所以它本質上是一個UICollectionView和一些內置的功能一個UIViewController。每文檔,該功能是:

如果集合視圖控制器有一個分配的筆尖文件或者是從一個情節串連圖板裝載 ,它加載從相應的筆尖 文件或情節串連圖板的視圖。如果以編程方式創建集合視圖控制器 ,它會自動創建一個新的未配置的 集合視圖對象,您可以使用collectionView 屬性訪問該對象。

當加載從故事板或筆尖文件的集合視圖,對於集合視圖的數據 源和委託對象從 筆尖文件獲得。如果未指定數據源或委託,則集合視圖控制器將自己分配給未指定的角色。

集合視圖即將首次出現時,集合視圖控制器將重新加載集合視圖數據。每次顯示視圖時,它也會清除當前所選內容。您可以通過將 clearsSelectionOnViewWillAppear屬性的值設置爲NO來更改此行爲 。

我更喜歡總是繼承UIViewController並在故事板中添加UICollectionView。這意味着我的子類必須實現UICollectionViewDataSource和UICollectionViewDelegate協議,並且我必須在故事板中設置它們,並且必須確保在視圖控制器出現時重新加載集合視圖。但是因爲我自己實施了這種行爲,所以感覺就像我有更多的控制權。如果您傾向於使用常規的默認行爲,那麼可以使用UICollectionViewController來節省時間。

我覺得UITableViewController和UIViewController與UITableView完全一樣 - 我更喜歡後者,原因完全相同。

0

如果您確定您的UI將只有CollectionView,使用CollectionViewController

此規則也適用於tableViews

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與數據源:在viewDidLoad中我

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

最後將數據源設置爲tableview:

tableView.dataSource = dataSource 

通過這樣做,您可以保持您的視圖控制器非常乾淨和小巧。您可以防止MVC(海量視圖控制器)問題,並遵循單一責任原則。此外,您的數據源現在可以在多個視圖控制器中重複使用。

相關問題