单个TableCell中的多个collectionView

时间:2017-08-31 10:27:28

标签: ios swift uitableview

我打算在单个tableView Cell中使用多个collectionView。

我真正想要的是以这种方式显示专辑照片(UI非常重要)。见图:

enter image description here

如何制作这个UI?

直到现在我已经拿了一个TableView - > TableCell(Single) - > 3个不同的集合查看单元格。

代码:

CustomGalleryController

class CustomGalleryController: UIViewController {

    var arrayOfPHAsset = [PHAsset]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        CustomAlbum().fetchCustomAlbumPhotos { (array) in
            self.arrayOfPHAsset = array
            CustomGalleryTableCell().firstCollectionArray  = array
            CustomGalleryTableCell().secondCollectionArray = array
            CustomGalleryTableCell().thirdCollectionArray  = array
            //self.collectionView.reloadData()
        }



    }

extension CustomGalleryController : UITableViewDelegate{

}

extension CustomGalleryController : UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomGalleryTableCell", for: indexPath) as! CustomGalleryTableCell

        return cell
    }
}

CustomGalleryTableCell

class CustomGalleryTableCell: UITableViewCell {


    @IBOutlet var firstCollectionView: UICollectionView!
    @IBOutlet var secondCollectionView: UICollectionView!
    @IBOutlet var thirdCollectionView: UICollectionView!

    var firstCollectionArray = [PHAsset]()
    var secondCollectionArray = [PHAsset]()
    var thirdCollectionArray = [PHAsset]()

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

extension CustomGalleryTableCell : UICollectionViewDataSource{

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
//        if collectionView == firstCollectionView {
//            return 1;//firstCollectionArray.count
//        }else if collectionView == secondCollectionView {
//            return 1;//secondCollectionArray.count
//        }else{
//            return 1;//thirdCollectionArray.count
//        }
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if collectionView == firstCollectionView {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FirstCollectionCell", for: indexPath) as! FirstCollectionCell

            return cell
        }else if collectionView == secondCollectionView {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SecondCollectionCell", for: indexPath) as! SecondCollectionCell

            return cell
        }else{
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ThirdCollectionCell", for: indexPath) as! ThirdCollectionCell

            return cell
        }
    }
}

但是崩溃了:

  

因未捕获的异常而终止应用程序NSInvalidArgumentException',   原因:' - [UITableView collectionView:numberOfItemsInSection:]:   无法识别的选择器发送到实例0x1049ed600

po 0x1049ed600给出:

<UITableView: 0x1049ed600; frame = (0 0; 414 736); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x17424b550>;
     

layer =; contentOffset:{0,0}; contentSize:   {414,44}&gt;

  1. 请建议任何其他有效的方法来实现此UI?
  2. 如果我使用此UI的方式正确,可能会导致崩溃的原因是什么?

3 个答案:

答案 0 :(得分:1)

使用CHTCollectionViewWaterfallLayout生成的 chiahsien 可以实现这一点。我已经使用过这个库了,我必须说它的工作真的很棒。

您可以使用pod安装它:

/classes/db/Db.php

可以找到Swift中的演示 here

与此示例唯一不同的是,您在顶部的每一列上都有一定的填充,但我确信这也是可以实现的。

答案 1 :(得分:1)

  

请建议任何其他好方法来实现此UI?

如果您的目标是实现屏幕截图中提到的内容,则无需将其实现为包含集合视图的tableview,而是使用UICollectionViewLayout的直接方式。

作为提示,为了节省一些时间和精力,您可以找到一个可以为您完成工作的库,例如:

或者如果您有兴趣重新排序这些项目:

答案 2 :(得分:0)

初学者使用swift和Xcode。我一直在寻找一个解决方案,在一个TableViewCell中填充两个CollectionView。即使这可能不适合您的情况,您的问题的标题也符合:-)最后通过在故事板中使用tag属性来设法完成。

我是这样做的:

  • 首先为故事板中的每个CollectionView提供标签号
  • 在ViewControllerDataSource中,使用if语句检查它是否是正确的CollectionView,并返回所需的任何内容(numberOfItemsInSection,cellForItemAt)。

    extension ViewController: UICollectionViewDataSource {
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            if collectionView.tag == 0 {
                return imageArray1.count
            } else {
                return imageArray2.count
            }
        }
    }
    

希望这有帮助!