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 中以编程方式更改 UICollectionViewCell 大小?