自定义UICollectionView数据源和委托

时间:2017-08-05 15:51:24

标签: ios swift xcode uicollectionview

由于我对XCode和Swift相对比较陌生,我几个小时都在苦苦挣扎。

我的故事板中有CollectionView,并希望将其数据源和委托方法链接到除ViewController之外的单独的类,但它无效。 有人可以帮忙吗?

override func viewDidLoad() {
    super.viewDidLoad()

    //
    self.card.center = CGPoint(x: self.view.center.x, y: self.view.center.y)

    self.card.layer.cornerRadius = 5

    self.card.layer.shadowOpacity = 0.1

    //

    self.card2.center = CGPoint(x: self.view.center.x, y: self.view.center.y)

    self.card2.layer.cornerRadius = 5

    self.card2.layer.shadowOpacity = 0.1

    //

    self.view.bringSubview(toFront: self.card)

    // HERE IS THE LINK

    setDS()

    collectionView.reloadData()
    // ----------------------




}

private func setDS() {

    let dataSourceAndDelegate = CollectionViewController()

    collectionView.dataSource = dataSourceAndDelegate
    collectionView.delegate = dataSourceAndDelegate


}


import UIKit

private let reuseIdentifier = "Cell"

class CollectionViewController: UICollectionViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = UIColor.red

        print("View did load")


        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Register cell classes
        self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)


        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    /*
     // MARK: - Navigation

     // In a storyboard-based application, you will often want to do a little preparation before navigation
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
     // Get the new view controller using [segue destinationViewController].
     // Pass the selected object to the new view controller.
     }
     */

    // MARK: UICollectionViewDataSource

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }


    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of items
        return 3
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)

        // Configure the cell
        cell.backgroundColor = UIColor.blue

        return cell
    }



    // MARK: UICollectionViewDelegate


    // Uncomment this method to specify if the specified item should be highlighted during tracking
    override func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }



    // Uncomment this method to specify if the specified item should be selected
    override func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
        return true
    }



    // Uncomment these methods to specify if an action menu should be displayed for the specified item, and react to actions performed on the item
    override func collectionView(_ collectionView: UICollectionView, shouldShowMenuForItemAt indexPath: IndexPath) -> Bool {
        return false
    }

    override func collectionView(_ collectionView: UICollectionView, canPerformAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
        return false
    }

    override func collectionView(_ collectionView: UICollectionView, performAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) {

    }


}

1 个答案:

答案 0 :(得分:0)

不要使用UICollectionViewController的子类作为自定义集合视图的数据源和委托。

而是使用简单的NSObject类。这样你只需要实现数据源和委托方法,而不必担心UIViewcontroller的视图方法(无论如何你都不需要它们)。

但即使你提供UICollectionViewController的对象,它也应该有效。它不起作用,因为您没有在ViewController类中保留该对象,并且它正在自动释放。 UICollectionView不保留delgeate和datasource以防止保留周期。

let dataSourceAndDelegate = CollectionViewController()

使dataSourceAndDelegate成为存储的属性。

此外,您需要在ViewController类中注册您的单元格(因为它具有您正在使用的集合视图)。请记住collectionView中的UICollectionViewController属性与ViewController中的collectionView不同。它是一个存储属性,因为UICollectionViewController带有一个colectionview。

private let reuseIdentifier = "Cell"

class ViewController: UIViewController {
    let dataSourceAndDelegate = CollectionViewController()
    @IBOutlet var collectionView:UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.setDS()
        collectionView.reloadData()

    }


    private func setDS() {
        // Register cell classes
        self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

        collectionView.dataSource = dataSourceAndDelegate
        collectionView.delegate = dataSourceAndDelegate

    }

}