自定义UICollectionView数据源和委托

问题描述:

我一直在挣扎几个小时,因为我对XCode和Swift比较陌生。自定义UICollectionView数据源和委托

我的故事板中有一个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?) { 

    } 


} 
+0

使用自定义类,而不是'UICollectionViewController'贯彻UICollectionView数据源协议和UICollectionView委托协议 –

请勿使用UICollectionViewController的子类作为自定义collectionview的数据源和委托。

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

但即使你提供的对象UICollectionViewController它应该工作。它不工作,因为你没有保留在你的类ViewController中的对象,它正在自动释放。 UICollectionView不保留delgeate和数据源以防止保留周期。

let dataSourceAndDelegate = CollectionViewController() 

使dataSourceAndDelegate一个存储的属性。另外,你需要在ViewController类中注册你的单元格(因为它有你正在使用的集合视图)。请记住collectionViewUICollectionViewController内的财产与您在ViewController的收藏查看不同。这是一个存储的财产,因为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 

    } 

} 
+2

非常感谢你。 dataSourceAndDelegate不是存储的属性是问题。非常感激! – Matt