Swift:如何以编程方式在 TableViewCell 中显示 CollectionView

Posted

技术标签:

【中文标题】Swift:如何以编程方式在 TableViewCell 中显示 CollectionView【英文标题】:Swift: How to display a CollectionView inside a TableViewCell Programmatically 【发布时间】:2020-10-01 15:10:58 【问题描述】:

此代码在 tableViewCell 中显示一个 collectionView,其中两个都已添加到 StoryBoard 中:

class TableViewCell: UITableViewCell 

    @IBOutlet weak var collectionView: UICollectionView!
    override func awakeFromNib() 
        super.awakeFromNib()
       collectionView.delegate = self
        collectionView.dataSource = self
    

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



extension TableViewCell:  UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout 
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return 1
    
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath)
        return cell
    
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        return CGSize(width: 139, height: 64)
    

在我的应用程序中,我正在以编程方式创建 CollectionView 和 TableView。

以编程方式创建一个collectionView:

class collectionViews 
     static func collectionViewOne() -> UICollectionView 
        let flowLayout = CarouselFlowLayout()
        let collectionViewOne = UICollectionView(frame: CGRect(x: 106, y: 313, width: 1708, height: 300), collectionViewLayout: flowLayout)
        return collectionViewOne
    

在tableViewCell中实例化collectionView:

class TableViewCell2: UITableViewCell 
    var moviesItems: [movieItem] = []
    let cellIdentifier = "movieCardCell"
    let collectionViewOne = collectionViews.collectionViewOne()

    private func setupCollectionView()

        collectionViewOne.delegate = self
        collectionViewOne.dataSource = self
        collectionViewOne.backgroundColor = UIColor (hex: "444A64")
         collectionViewOne.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MyCell")
                 let nib = UINib(nibName: "movieCardCell", bundle: nil)
        collectionViewOne.register(nib, forCellWithReuseIdentifier: cellIdentifier)

    


// These functions never get called
 extension TableViewCell:  UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout 
 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
     print("INSIDE TableViewCell2.collectionView 1")
     return 1
 
 
 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath)
     print("INSIDE TableViewCell2.collectionView 2")
     return cell
 
 
 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
     // For some reason he chose the measures of collectionViewCell and substracted 2
     print("INSIDE TableViewCell2.collectionView 3")
     return CGSize(width: 139, height: 64)
 
 

注意:委托函数永远不会被调用。所以 collectionView 从来没有添加到 tableViewCell 中?

以编程方式创建 TableView:

class sectionTableCell: TableViewCell2 

class MoviesViewController4: UIViewController 
    let tableView = UITableView()
    override func viewDidLoad() 
        super.viewDidLoad()
        self.view.backgroundColor = UIColor (hex: "444A64")
        tableView.delegate = self
        tableView.dataSource = self
         tableView.register(sectionTableCell.self, forCellReuseIdentifier: "tableViewCell")
        displayTableView2()
    

    func displayTableView2() 
        self.view.addSubview(tableView)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    



extension MoviesViewController4: UITableViewDelegate, UITableViewDataSource 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        guard let cell =
            tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as? sectionTableCell
          else 
                fatalError("Unable to create explore table view cell")
        return cell
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 140
    

所以问题是: 如何将我以编程方式创建的collectionView添加到我也以编程方式创建的tableViewCell中?

【问题讨论】:

你可以参考这个:- johncodeos.com/… 【参考方案1】:

据我所知,您不会在代码中的任何位置调用 setupCollectionView() 方法。您应该在 UITableViewCell 的 init 方法中执行此操作。 将此代码添加到您的单元格类中:

override init(frame: CGRect) 
    super.init(frame: frame)
    setupCollectionView()


required init?(coder: NSCoder) 
    super.init(coder: coder)
    setupCollectionView()

【讨论】:

以上是关于Swift:如何以编程方式在 TableViewCell 中显示 CollectionView的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中以编程方式减少obj文件

如何在 Swift 中以编程方式更改 UICollectionViewCell 大小?

如何在 Swift 中以编程方式启用/禁用菜单对象

Swift:如何以编程方式在 TableViewCell 中显示 CollectionView

如何使用 Swift 以编程方式添加约束

如何在 Swift 中以编程方式旋转一组按钮?