自定义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?) {
}
}
请勿使用UICollectionViewController
的子类作为自定义collectionview的数据源和委托。
改为使用简单的NSObject类。这样你只需要实现数据源和委托方法,不必担心UIViewcontroller的视图方法(你不需要它们)。
但即使你提供的对象UICollectionViewController
它应该工作。它不工作,因为你没有保留在你的类ViewController
中的对象,它正在自动释放。 UICollectionView不保留delgeate和数据源以防止保留周期。
let dataSourceAndDelegate = CollectionViewController()
使dataSourceAndDelegate
一个存储的属性。另外,你需要在ViewController类中注册你的单元格(因为它有你正在使用的集合视图)。请记住collectionView
UICollectionViewController
内的财产与您在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
}
}
非常感谢你。 dataSourceAndDelegate不是存储的属性是问题。非常感激! – Matt
使用自定义类,而不是'UICollectionViewController'贯彻UICollectionView数据源协议和UICollectionView委托协议 –