为啥我的自定义 UITableViewcell 没有显示?

Posted

技术标签:

【中文标题】为啥我的自定义 UITableViewcell 没有显示?【英文标题】:Why isn’t my custom UITableView cell showing?为什么我的自定义 UITableViewcell 没有显示? 【发布时间】:2020-05-12 06:34:47 【问题描述】:

我已经为 UITableView 实现了一个自定义单元格,但是当我运行 Playground 时,它只是一个标准表格。这可能很简单,但我对 UIKit 很陌生,对 Swift 也很陌生。

此外,我尝试实现“粘性标题”,但无论我尝试什么,标题都会随着表格的其余部分滚动。

import UIKit
import PlaygroundSupport



class ViewController : UIViewController, UITableViewDelegate, UITableViewDataSource 

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell: CardCell = tableView.dequeueReusableCell(withIdentifier: "CardCell", for: indexPath) as! CardCell
        cell.messageLabel.text = "yo"
        return cell
    


    var convoTableView = UITableView()

    override func viewDidLoad()
        super.viewDidLoad()

        convoTableView = UITableView(frame: self.view.bounds, style:
            UITableView.Style.plain)
        convoTableView.backgroundColor = UIColor.white
        convoTableView.register(CardCell.self, forCellReuseIdentifier: "CardCell")
        let header = UIView(frame: CGRect(x: 0, y: 0, width: convoTableView.frame.width, height: 100))
        header.backgroundColor = .red

        self.convoTableView.delegate = self
        self.convoTableView.dataSource = self

        let yourLabel = UILabel(frame: CGRect(x: 10, y: 0, width: 100, height: 100))
        yourLabel.textColor = UIColor.black
        yourLabel.backgroundColor = UIColor.white
        yourLabel.text = "mylabel text"

        header.addSubview(yourLabel)

        convoTableView.tableHeaderView = header
        convoTableView.estimatedSectionHeaderHeight = 40.0

        self.view.addSubview(convoTableView)
    







class CardCell: UITableViewCell 


    let messageLabel:UILabel = 
        let label = UILabel()
        label.font = UIFont.boldSystemFont(ofSize: 14)
        label.clipsToBounds = true
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    ()

    let dateLabel:UILabel = 
        let label = UILabel()
        label.font = UIFont.boldSystemFont(ofSize: 8)
        label.clipsToBounds = true
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    ()

    let containerView:UIView = 
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.clipsToBounds = true
        return view
    ()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        containerView.addSubview(messageLabel)
        containerView.addSubview(dateLabel)
        self.contentView.addSubview(containerView)
    

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



PlaygroundPage.current.liveView = ViewController()

【问题讨论】:

【参考方案1】:

这里是制作自定义单元格和粘性标题所需的所有代码:

import UIKit
import PlaygroundSupport

class ViewController: UITableViewController 

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
        let view = UIView()
        view.backgroundColor = .purple
        return view
    

    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
        50
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        19
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "CardCell", for: indexPath) as! CardCell
        cell.textLabel?.text = "\(indexPath.row)"
        return cell
    

    override func viewDidLoad()
        super.viewDidLoad()

        tableView.register(CardCell.self, forCellReuseIdentifier: "CardCell")
    



class CardCell: UITableViewCell  

PlaygroundPage.current.liveView = ViewController()

【讨论】:

【参考方案2】:

要使表头在表格视图中具有粘性且不可滚动,您需要在表格视图上方使用不同的 UIView,并在 UiView 下方提供表格的框架。

customView = MyCustomView(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
self.view.addSubview(customView

【讨论】:

以上是关于为啥我的自定义 UITableViewcell 没有显示?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的自定义 UITableViewcell 没有显示?

为啥我的自定义 UITableViewCell 宽度在初始加载时不正确?

为啥我的自定义单元格仅在用户移开手指时突出显示?

为啥在我的自定义 UIView 类中没有调用 init(frame: CGRect)?

如何阻止我的自定义 UITableViewCell backgroundImage 可拉伸?

我的自定义 UITableViewCell 表格单元格显示为项目的空白列表