迅速.如何在ViewController以外的单独swift文件中编写UICollectionView

Tri*_*yen 1 ios uicollectionview swift

我找到了一些关于如何使用UICollectionView的教程.但他们只是在ViewController中编写它们.我想知道如何在另一个swift文件中编写UICollectionView.然后在我的ViewController类中调用它.这是我的UICollectionView代码.

import UIKit

class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {

    var collectionView: UICollectionView!
    var ImageNames: [String] = ["photo", "photo1", "photo2", "photo3"]

    override func viewDidLoad() {
        super.viewDidLoad()

        let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
        layout.itemSize = CGSize(width: 90, height: 120)

        collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
        collectionView.dataSource = self
        collectionView.delegate = self
        collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
        collectionView.backgroundColor = UIColor.whiteColor()
        self.view.addSubview(collectionView)
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return ImageNames.count
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath)
        let imageView = UIImageView(image: UIImage(named: ImageNames[indexPath.row]))
        cell.backgroundView = imageView
        return cell
    }

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        let cell = collectionView.cellForItemAtIndexPath(indexPath)
        cell?.backgroundView = nil
    }

}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,第二个问题.在我的代码中,我目前通过func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell使数组全局传递数组.如何在本地将ImagesNames数组传递给此函数?

Mag*_*goo 7

重要的是

collectionView.dataSource = self
collectionView.delegate = self
Run Code Online (Sandbox Code Playgroud)

这告诉你的集合查看在哪里找到它的数据源/委托方法,如 cellForItemAtIndexPath

你应该创建一个新的类,UICollectionViewDataSourceUICollectionViewDelegate在视图控制器中创建一个lazy var

所以新课......

class MyDataController: NSObject, UICollectionViewDataSource, UICollectionViewDelegate {

  // all collection view stuff here

}
Run Code Online (Sandbox Code Playgroud)

然后在你的ViewController中

lazy var dataController: MyDataController = {

    let dataController = MyDataController()

    return dataController
}()
Run Code Online (Sandbox Code Playgroud)

最后

collectionView.dataSource = self
collectionView.delegate = self
Run Code Online (Sandbox Code Playgroud)

collectionView.dataSource = self.dataController
collectionView.delegate = self.dataController
Run Code Online (Sandbox Code Playgroud)

关于第二个问题,您需要仔细考虑如何使用MVC约定存储数据.您可以在dataController中拥有一个本地数组变量来控制collectionView中显示的信息,但是如何全局获取和保留该信息是一个广泛的主题.

**编辑**

跟进为什么懒惰的问题......

override func viewDidLoad() {
    super.viewDidLoad()

    let dataController:MyDataController = MyDataController()
    let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
    layout.itemSize = CGSize(width: 90, height: 120)

    collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    collectionView.dataSource = self
    collectionView.delegate = self
    collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
    collectionView.backgroundColor = UIColor.whiteColor()
    self.view.addSubview(collectionView)
}
Run Code Online (Sandbox Code Playgroud)

成为,取决于这样的选择

override func viewDidLoad() {

    super.viewDidLoad()
    self.view.addSubview(collectionView)
}

// all other code

// then right at the bottom of your class

// MARK: - Properties

lazy var collectionView: UICollectionView = {

    let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
    layout.itemSize = CGSize(width: 90, height: 120)

    let collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    collectionView.dataSource = self.dataController
    collectionView.delegate = self.dataController
    collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
    collectionView.backgroundColor = UIColor.whiteColor()

    return collectionView
}()

lazy var dataController: MyDataController = {

    let dataController = MyDataController()
    dataController.delegate = self
    // more setup if needed

    return dataController
}()        
Run Code Online (Sandbox Code Playgroud)

我觉得这很方便,你的属性总是很容易找到,易于移动和易于改变.如果我在这种情况下注释掉那条addSubview线就viewDidLoad足以阻止collectionViewdataController初始化.也许这个例子太过分了,但从整体上采用它可以节省大量时间并产生干净的可读oo代码.