2014-09-02 37 views
0

我有一個UICollectionView,我通過故事板放置在自定義UIViewController中,並將其前導/尾隨/頂部/底部空間固定到其超級視圖。UICollectionView包裹在UIViewController中

然後,我有一個應該使用集合視圖的自定義UICollectionViewController子類。所以在superview的UIViewController(PrimaryViewController)中,我有一個集合視圖的插座,並且實例化我的自定義UICollectionViewController。我將它分配給集合視圖,並將自定義UICollectionViewController分配爲集合視圖的委託和數據源。

但是,當我運行這個,收集視圖不會出現在屏幕上。很明顯,viewDidLoad()在自定義類UICollectionViewController中沒有被調用,所以要麼我缺少關鍵部分,要麼我以錯誤的方式接近。

有人可以告訴我如何構建集合視圖(通過Storyboard放置)和自定義類(僅用於代碼)之間的連接,以使其正常工作?

這是我(簡化)代碼,到目前爲止...

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() 
    } 
} 
+0

爲什麼不能在'PrimaryViewController' IB嵌入'CustomCollectionViewController'。您可以將'UICollectionViewController'添加到'UIViewController',然後將其類更改爲您的自定義類。 – thelaws 2014-09-02 17:54:05

+0

@thelaws原因是在我的PrimaryViewController視圖中還有一個工具欄,不僅僅是集合視圖。 – BadmintonCat 2014-09-02 18:07:15

回答

1

在IB或你的故事板,你可以使用容器視圖並嵌入您的自定義集合視圖控制器。這使您能夠在自己的上下文中操作每個視圖控制器,因爲它們都有自己的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() 
    } 
} 

這也將呼籲viewDidLoad()CustomCollectionViewController。您可以隱藏並顯示通過_collectionView屬性的視圖,或通過_collectionViewController直接操縱它。

疼痛來自任何邏輯,可能是外觀邏輯(viewWillAppear(_: Bool),viewWillDisappear(_: Bool)等),因爲你必須自己觸發這些。

你的故事板應該是這個樣子(我的容器視圖是隱藏的):

Storyboard example

+0

我會試試這個!我不知道一個CollectionViewController可以在一個Container中使用,我以爲只有UIViews。感謝您指出了這一點! – BadmintonCat 2014-09-02 18:27:33

1

需要注意的是充當一個UICollectionView委託/數據源的對象沒有從UICollectionViewController的。事實上,它不應該是除非你在故事板中拖出一個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 
+0

然而,這並沒有解決我的問題,集合視圖沒有出現。當我註釋掉_collectionViewCtrl = CustomCollectionViewController(collectionView:_collectionView)時,collectionView會正常顯示。所以這意味着自定義的collectionViewController與集合視圖沒有關係。 – BadmintonCat 2014-09-02 18:21:32