CollectionView 中的 TableView 使应用程序崩溃
TableView inside a CollectionView crashes the app
我正在构建一个多屏应用程序,它使用 UICollection 视图在 UIViewController 之间导航。左边是绿色,右边是红色。向左或向右滑动即可转到 ViewController。它有效,但是当我将 TableViewController 添加到绿色表时,应用程序崩溃了。我添加了所有网点。它说:
滑动ViewController[11639:3937203] 致命错误:在隐式展开可选值时意外发现 nil:文件 SwipeViewController/GreenViewController.swift,第 21 行
指向 tableViewI.delegate = self.
这是 CollectionView 代码:
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
@IBOutlet var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
collectionView.backgroundColor = .yellow
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "collectionViewCell")
collectionView.isPagingEnabled = true
collectionView.scrollToItem(at: IndexPath(item: 1, section: 0), at: .centeredVertically, animated: false)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 2
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath)
//cell.backgroundColor = indexPath.item % 2 == 0 ? .purple : cell.backgroundColor
switch indexPath.row {
case 0:
self.addChild(GreenViewController())
cell.contentView.addSubview(GreenViewController().view)
case 1:
self.addChild(RedViewController())
cell.contentView.addSubview(RedViewController().view)
default:
print("nothing")
}
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: self.view.frame.width, height: self.view.frame.height)
}
这里是包含 tableView 的绿色 ViewController:
class 绿色ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableViewI: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .green
tableViewI.delegate = self
tableViewI.dataSource = self
tableViewI.register(UINib.init(nibName: "cellID", bundle: nil), forCellReuseIdentifier: "cellID")
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellID") as! TableViewCell
cell.backgroundColor = .blue
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
我认为问题出在参考 GreenViewController
尝试将 viewController 保存为 属性,然后再将其添加为子项。
可能的问题是您的 greenViewController
可能在您访问它之前被释放。
let greenViewController = GreenViewController()
let redViewController = RedViewController()
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath)
//cell.backgroundColor = indexPath.item % 2 == 0 ? .purple : cell.backgroundColor
switch indexPath.row {
case 0:
self.addChild(greenViewController)
cell.contentView.addSubview(greenViewController.view)
case 1:
self.addChild(redViewController)
cell.contentView.addSubview(redViewController.view)
default:
print("nothing")
}
return cell
}
问题在于您如何创建 GreenViewController 的对象class。
您必须从情节提要中加载它,而不是仅从 GreenViewController 的 init 方法中创建它。否则,插座属性将为零。
let vc = storyboard?.instantiateViewController(withIdentifier: "yourIdentifier") as! GreenViewController
我正在构建一个多屏应用程序,它使用 UICollection 视图在 UIViewController 之间导航。左边是绿色,右边是红色。向左或向右滑动即可转到 ViewController。它有效,但是当我将 TableViewController 添加到绿色表时,应用程序崩溃了。我添加了所有网点。它说:
滑动ViewController[11639:3937203] 致命错误:在隐式展开可选值时意外发现 nil:文件 SwipeViewController/GreenViewController.swift,第 21 行
指向 tableViewI.delegate = self.
这是 CollectionView 代码:
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
@IBOutlet var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
collectionView.backgroundColor = .yellow
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "collectionViewCell")
collectionView.isPagingEnabled = true
collectionView.scrollToItem(at: IndexPath(item: 1, section: 0), at: .centeredVertically, animated: false)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 2
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath)
//cell.backgroundColor = indexPath.item % 2 == 0 ? .purple : cell.backgroundColor
switch indexPath.row {
case 0:
self.addChild(GreenViewController())
cell.contentView.addSubview(GreenViewController().view)
case 1:
self.addChild(RedViewController())
cell.contentView.addSubview(RedViewController().view)
default:
print("nothing")
}
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: self.view.frame.width, height: self.view.frame.height)
}
这里是包含 tableView 的绿色 ViewController:
class 绿色ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableViewI: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .green
tableViewI.delegate = self
tableViewI.dataSource = self
tableViewI.register(UINib.init(nibName: "cellID", bundle: nil), forCellReuseIdentifier: "cellID")
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellID") as! TableViewCell
cell.backgroundColor = .blue
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
我认为问题出在参考 GreenViewController
尝试将 viewController 保存为 属性,然后再将其添加为子项。
可能的问题是您的 greenViewController
可能在您访问它之前被释放。
let greenViewController = GreenViewController()
let redViewController = RedViewController()
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath)
//cell.backgroundColor = indexPath.item % 2 == 0 ? .purple : cell.backgroundColor
switch indexPath.row {
case 0:
self.addChild(greenViewController)
cell.contentView.addSubview(greenViewController.view)
case 1:
self.addChild(redViewController)
cell.contentView.addSubview(redViewController.view)
default:
print("nothing")
}
return cell
}
问题在于您如何创建 GreenViewController 的对象class。
您必须从情节提要中加载它,而不是仅从 GreenViewController 的 init 方法中创建它。否则,插座属性将为零。
let vc = storyboard?.instantiateViewController(withIdentifier: "yourIdentifier") as! GreenViewController