UICollectionView中的UITableView - > [error]在展开tableView

时间:2016-11-26 01:53:13

标签: ios swift uitableview uicollectionview storyboard

我在UICollectionView的每个单元格中都有一个UITableView。

我将表视图引用到了一个FeedCell类,它是集合视图中每个单元格的一个类。但是,我收到了一个错误

fatal error: unexpectedly found nil while unwrapping an Optional value

尝试访问FeedCell类中的tableView对象时。我三重检查我是否正确引用了故事板中的表格视图,所以我假设还有其他因素导致它为零,但我不确定它是什么。有没有人知道如何解决这个问题?

这是我的VC,其中包含集合视图和表视图。

class HomeViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate,UICollectionViewDelegateFlowLayout, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var collectionView: UICollectionView!
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.navigationBar.isTranslucent = false
        collectionView.register(FeedCell.self, forCellWithReuseIdentifier: "FeedCell")
    }

    // for feedcell and its collection view
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return images.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FeedCell", for: indexPath) as! FeedCell
        cell.backgroundColor = backgrounds[indexPath.row]
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        guard let collectionViewCell = cell as? FeedCell else { return }

        collectionViewCell.setTableViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row)
    }


    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {

        return CGSize(width: view.frame.width, height: view.frame.height)
    }

    // conform to tableview protocol for hometable
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return images[tableView.tag].count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "HomeCell", for: indexPath)
        cell.imageView?.image = images[tableView.tag][indexPath.item]
        return cell
    }


    override func viewWillAppear(_ animated: Bool) {
        self.navigationController?.setNavigationBarHidden(true, animated: animated)
        super.viewWillAppear(animated)
    }

    override func viewWillDisappear(_ animated: Bool) {
        self.navigationController?.setNavigationBarHidden(false, animated: animated)
        super.viewWillDisappear(animated)
    }


}

这是集合视图的一个单元格,我引用了表视图。

class FeedCell: BaseCollectionViewCell{

    @IBOutlet weak var tableView: UITableView!
    override func setupViews() {
        super.setupViews()
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 4
    }

}


extension FeedCell {

    func setTableViewDataSourceDelegate
        <D: UITableViewDataSource & UITableViewDelegate>
        (dataSourceDelegate: D, forRow row: Int) {

        # ERROR!
        tableView.delegate = dataSourceDelegate
        tableView.dataSource = dataSourceDelegate
        tableView.tag = row
        tableView.reloadData()
    }

}

1 个答案:

答案 0 :(得分:0)

在这一行:

 (dataSourceDelegate: D, forRow row: Int)

您将其转换为变量:D

请改用:

tableView.dataSource = D
tableView.delegate = D