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