ios - 自定义 UICollectionView 数据源和委托(delegate)

标签 ios swift xcode uicollectionview

由于我对 XCode 和 Swift 比较陌生,我已经为此苦苦挣扎了几个小时。

我的 Storyboard 中有一个 CollectionView,并且希望将其数据源和委托(delegate)方法链接到除我的 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?) {

    }


}

最佳答案

不要使用 UICollectionViewController 的子类作为自定义 CollectionView 的数据源和委托(delegate)。

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

但即使您提供 UICollectionViewController 对象,它也应该可以工作。它不起作用,因为您没有在 ViewController 类中保留该对象,并且它正在自动释放。 UICollectionView 不保留 delgeate 和数据源以防止保留循环。

let dataSourceAndDelegate = CollectionViewController()

dataSourceAndDelegate 设为存储属性。

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

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

    }

}

关于ios - 自定义 UICollectionView 数据源和委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45523768/

相关文章:

ios - 本地通知在 ios10 中不触发

ios - 编译日期 (__DATE__) 返回昨天的日期

swift - "No targets to convert found"尝试转换为当前 Swift 语法时

ios - 如何使用 xcconfig 文件在不同平台的 XCFramework 中链接正确的框架

ios - 将新的 APNS 证书上传到 GCM

ios - MVVMCROSS Ios 绑定(bind) ShowViewModel

android - 使用 gradleFX 为多个客户构建 AIR 移动项目

swift - 协议(protocol)中的泛型

ios - Parse.com BETWEEN 查询

ios - 如何从两个不同的 IOC 容器解析单例实例