2017-08-23 50 views
1

試圖從故事板跳轉出貨。我試圖把兩個UIViewControllers放入視圖中,並水平滾動。以編程方式在商店中添加兩個UICollectionViews

因此,首先,我去到應用程序委託

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    window = UIWindow(frame: UIScreen.main.bounds); 
    window?.makeKeyAndVisible() 

    var homeViewController = ViewController() 
    let shirtStore = ShirtStore() 
    let pantStore = PantStore() 
    homeViewController.shirtStore = shirtStore 
    homeViewController.pantStore = pantStore 

    window?.rootViewController = UINavigationController(rootViewController: ViewController()) 


    return true 
} 

我不知道如果我裝的是第一homeViewController。

然後,在我的ViewController我:

import UIKit 

class ViewController: UIViewController, 
UICollectionViewDelegateFlowLayout, UICollectionViewDataSource { 



let collectionViewShirts = UICollectionView() 
let collectionViewPants = UICollectionView() 
let collectionViewShirtsIdentifier = "CollectionViewShirtsCell" 
let collectionViewPantsIdentifier = "CollectionViewPantsCell" 

var shirtStore: ShirtStore! 
var pantStore: PantStore! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    navigationItem.title = "Hanger" 

    view.backgroundColor = UIColor.red 

    collectionViewShirts.delegate = self 
    collectionViewPants.delegate = self 

    collectionViewShirts.dataSource = self 
    collectionViewPants.dataSource = self 

    self.view.addSubview(collectionViewShirts) 
    self.view.addSubview(collectionViewPants) 

    collectionViewShirts.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewShirtsCell") 
} 

     func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

if collectionView == self.collectionViewShirts { 
     let cellA = collectionView.dequeueReusableCell(withReuseIdentifier: collectionViewShirtsIdentifier, for: indexPath as IndexPath) 

     // Set up cell 
     cellA.backgroundColor = UIColor.blue 
     return cellA 
    } 

    else { 
     let cellB = collectionView.dequeueReusableCell(withReuseIdentifier: collectionViewPantsIdentifier, for: indexPath as IndexPath) 

     // ...Set up cell 
     cellB.backgroundColor = UIColor.red 
     return cellB 
    } 
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int{ 
    if(collectionView == collectionViewShirts) 
    { 
     return shirtStore.allShirts.count 
    } 
    else if (collectionView == collectionViewPants) 
    { 

     return 5//pantStore.allPants.count 
    } 
    else 
    { 
     return 5//shoeStore.allShoes.count 
    } 
    } 
} 

我的應用程序是由於零布局參數終止。我錯過了什麼。構建時沒有警告。

+0

閱讀UICollectionView的文件和什麼異常告訴你;一個UICollectionView需要一個UIcollectionViewLayout;您需要通過適當的初始化程序提供一個。您還需要設置約束或收集視圖的框架。你即將發現不使用故事板是一項更多的工作,在我看來,通常不值得痛苦。 – Paulw11

+0

一個明顯的問題是,您從未設置集合視圖的框架。使用正確的'init'方法。 – rmaddy

+0

@ Paulw11找不到與故事板配合使用的故事板。我期望使用programatic swift來解決的主要用例是將視圖帶到前面(如放大圖片/細節模式類型的東西)。看起來謊言動畫和交換視圖將是編程快速的理想選擇。 – user1093111

回答

1

您無法初始化沒有參數的UICollectionView。您需要提供一個collectionViewLayout參數,以便收集視圖知道如何排列其內容。

相反,創建一個佈局對象並使用它來初始化集合視圖。在Swift中這樣做的一個好方法是使用延遲閉包來初始化屬性。

public lazy var collectionViewShirts: UICollectionView = { 
    let layout = UICollectionViewFlowLayout() 
    let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout) 
    collectionView.delegate = self 
    collectionView.dataSource = self 
    // any other configuration here 
    return collectionView 
}() 
+0

您仍然需要爲集合視圖指定一個有效的框架,以便它可見。 – rmaddy

+0

@rmaddy是的!您還需要將其添加爲子視圖,實現委託和數據源方法等。試圖儘快解決提問者的直接問題,因爲如果需要完整的解決方案,還有很多其他的優秀答案和教程。 – nathan

+0

很酷,謝謝。工作喜歡魅力。 – user1093111

1

只需添加UICollectionViewFlowLayout到您的收藏觀

public var collectionViewShirts : UICollectionView{ 

     let layout = UICollectionViewFlowLayout() 
     let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout) 
     collectionView.delegate = self 
     collectionView.dataSource = self 
     return collectionView 

    } 
    public var collectionViewPants :UICollectionView{ 

     let layout = UICollectionViewFlowLayout() 
     layout.scrollDirection = UICollectionViewScrollDirection.horizontal 

     let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout) 
     collectionView.delegate = self 
     collectionView.dataSource = self 
     return collectionView 

    } 
相關問題