如何在 UICollectionViewCell 中显示 UITableView

Posted

技术标签:

【中文标题】如何在 UICollectionViewCell 中显示 UITableView【英文标题】:How do I show a UITableView within a UICollectionViewCell 【发布时间】:2017-08-19 03:59:22 【问题描述】:

我是一名新的 Swift 程序员,我目前正在开发一个非常简单的待办事项列表应用程序。问题是我也想显示一个不要做的列表。此外,我试图通过代码来完成这一切。

我希望用户能够在 2 个 CollectionViewCells 之间水平滚动,每个 CollectionViewCells 中都有一个 TableView 显示一个“待办事项列表”和一个“不做事项列表”。

到目前为止,我有一个 ViewController,它创建了一个 UICollectionView,它有 2 个自定义单元格,每个单元格都填满了窗口,因此用户可以在它们之间滚动。

我正在处理“Not To Do List”单元格,我试图在其中显示一个 TableView,但我无法显示它。

这是我的代码:

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate,UICollectionViewDelegateFlowLayout
...
collectionView.register(ToDoListCell.self, forCellWithReuseIdentifier: toDoListCellid)
collectionView.register(NotToDoListCell.self, forCellWithReuseIdentifier: notToDoListCellid)
...
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

    if (indexPath.item == 0) 
        let toDoCell = collectionView.dequeueReusableCell(withReuseIdentifier: toDoListCellid, for: indexPath)
        return toDoCell
    
    else 
        let notToDoCell = collectionView.dequeueReusableCell(withReuseIdentifier: notToDoListCellid, for: indexPath)
        return notToDoCell
    




class NotToDoListCell: UICollectionViewCell 

var ntdlArray = ["Play Video Games", "Eat out", "Watch Netflix"]
let ntdlCell = "ntdlCell"

override init(frame: CGRect) 
    super.init(frame: frame)
    backgroundColor = UIColor.orange


required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")





extension NotToDoListCell: UITableViewDelegate, UITableViewDataSource 
func numberOfSections(in tableView: UITableView) -> Int 
    return ntdlArray.count


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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: ntdlCell, for: indexPath)

    cell.textLabel?.text = ntdlArray[indexPath.item]

    return cell


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return 50


我希望表格视图会显示 3 行文本,其中包含:“Play Video Games”、“Eat Out”和“Watch Netflix”,但我看到的只是一个橙色屏幕(从我设置NotToDoListCell 的背景颜色为橙色)。任何帮助将不胜感激。

提前谢谢你。

【问题讨论】:

您需要在单元格中添加一个表格视图。您是在故事板或 NIB 文件中定义单元格吗?还是您想以编程方式完成所有操作? 【参考方案1】:

您需要在 NotToDoListCell 中添加 tableView 作为 xib 文件的出口,并添加 awakeFromNib 方法 self.tableView.dataSource = self

class NotToDoListCell: UICollectionViewCell 

var ntdlArray = ["Play Video Games", "Eat out", "Watch Netflix"]
let ntdlCell = "ntdlCell"

override init(frame: CGRect) 
    super.init(frame: frame)
    backgroundColor = UIColor.orange


required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")



override func awakeFromNib()
    super.awakeFromNib()
    self.tableView.dataSource = self



extension NotToDoListCell: UITableViewDelegate, UITableViewDataSource 
func numberOfSections(in tableView: UITableView) -> Int 
    return ntdlArray.count


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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: ntdlCell, for: indexPath)

    cell.textLabel?.text = ntdlArray[indexPath.item]

    return cell


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return 50


【讨论】:

【参考方案2】:

要在不使用 nib/xib 文件的情况下完全以编程方式完成此操作,您需要在 collectionview 单元格中创建一个表格视图,您可以执行以下操作:

class NotToDoListCell: UICollectionViewCell 

   lazy var tableView: UITableView = 
         let tblView = UITableView()
         tblView.delegate = self
         tblView.dataSource = self
         tblView.translatesAutoresizingMaskIntoConstraints = false
         return tblView
   ()

var ntdlArray = ["Play Video Games", "Eat out", "Watch Netflix"]
let ntdlCell = "ntdlCell"


override init(frame: CGRect) 
    super.init(frame: frame)
    backgroundColor = UIColor.orange

    tableView.register(UITableViewCell.self, forCellReuseIdentifier: ntdlCell) 
    setupTableView()


func setupTableView() 

    addSubview(tableView)
    tableView.topAnchor.constraint(equalTo: topAnchor).isActive = true
    tableView.bottom.constraint(equalTo: bottomAnchor).isActive = true
    tableView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
    tableView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true 




required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")





extension NotToDoListCell: UITableViewDelegate, UITableViewDataSource 
func numberOfSections(in tableView: UITableView) -> Int 
    return ntdlArray.count


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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: ntdlCell, for: indexPath)

    cell.textLabel?.text = ntdlArray[indexPath.item]

    return cell


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return 50


【讨论】:

谢谢你,我昨晚在想这个,你已经确认了我的回答!非常感谢! @MikeH 如果这是正确答案,请采纳,谢谢

以上是关于如何在 UICollectionViewCell 中显示 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7 中刷新 UICollectionViewCell?

如何在 UICollectionViewCell 内缩放 UIScrollView?

如何在重新加载时清除 UICollectionViewCell?

Swift:如何在 UICollectionViewCell 中使用“prepareForSegue”?

点击时如何在 UICollectionViewCell 中制作此动画?

如何确定何时显示 UICollectionViewCell?