我已使用IBOutlet将TableView正确连接到CollectionViewCell,但是当我尝试使用此Tableview执行某些操作时,例如:cell.tableview.tag = x
,它说:
意外地发现nil,同时隐式展开Optional值。 当我取消评论
import UIKit
class CollectionCell: UICollectionViewCell {
// When I uncomment the next line, it works good
//let tableView = UITableView()
@IBOutlet var tableView: UITableView!
}
class ViewController: UIViewController {
var testArray = [["Day0-0","Day0-1","Day0-2"], ["Day1-0","Day1-1","Day1-2"], ["Day2-0","Day2-1","Day2-2"],["Day3-0","Day3-1","Day3-2"],["Day4-0","Day4-1","Day4-2"]]
@IBOutlet weak var collectionView: UICollectionView!
// let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
collectionView.delegate = self
collectionView.dataSource = self
collectionView.register(CollectionCell.self, forCellWithReuseIdentifier: "CollectionCell")
view.addSubview(collectionView)
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[collectionView]|", options: [], metrics: nil, views: ["collectionView":collectionView]))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[collectionView]|", options: [], metrics: nil, views: ["collectionView":collectionView]))
}
}
extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return testArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionCell", for: indexPath) as! CollectionCell
// Here is where i get the error: "Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value"
cell.tableView.tag = indexPath.item
cell.tableView.reloadData()
cell.tableView.delegate = self
cell.tableView.dataSource = self
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return collectionView.frame.size
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return testArray[tableView.tag].count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") ?? UITableViewCell(style: .default, reuseIdentifier: "Cell")
cell.textLabel?.text = testArray[tableView.tag][indexPath.row]
return cell
}
}
答案 0 :(得分:1)
从您的viewDidLoad方法中删除此行。
collectionView.register(CollectionCell.self, forCellWithReuseIdentifier: "CollectionCell")
它用于在集合视图中注册以编程方式创建的集合视图单元格。 如果在情节提要中拥有所有内容时使用此方法,它将在IBOutlets为零的位置创建一个单元格。
答案 1 :(得分:1)
似乎您的单元格是用Nib文件创建的。在这种情况下,您应该使用register
参数调用UINib
的重载:
collectionView.register(UINib(nibName: "CollectionCell", bundle: nil), forCellReuseIdentifier: "CollectionCell")
并确保Nib文件中单元格的类设置为CollectionCell
,并且插座正确连接。