由于我对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?) {
}
}
答案 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
}
}