如何以编程方式在 UITableViewCell 中添加自定义视图?

Posted

技术标签:

【中文标题】如何以编程方式在 UITableViewCell 中添加自定义视图?【英文标题】:how to add custom view on UITableViewCell programatically? 【发布时间】:2019-04-06 23:36:50 【问题描述】:

UPD 已解决 - 请参阅下面已编辑的问题

尝试向 UITableViewCell 的自定义子类添加自定义视图(更具体的按钮),但在设备上的 ios 10.1 上无法看到任何布局结果。没有看到布局上的任何变化,并尝试用红色背景的自定义视图填充单元格,但也未能达到此结果。

import UIKit

class Save: UITableViewCell 

    let containerView: UIView = 
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = .red
        return view
    ()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupViews()
    

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


    func setupViews() 
        self.translatesAutoresizingMaskIntoConstraints = false
        addSubview(containerView)
        containerView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
        containerView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
        containerView.topAnchor.constraint(equalTo: topAnchor).isActive = true
        containerView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true

    


除此之外我还尝试过:使用普通的 addSubiew 和约束到单元格的 self 锚点,并添加到 tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 中的 contentView 但两种方法都没有做任何事情,单元格出现但它是空的。

UPD 附上TableView启动代码供参考

class SettingsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    let settings = [
        "setting1",
        "setting2",
        "setting3",
        "setting4",
        "setting5",
        "setting6",
        "setting7"
    ]


    let overlay: UIView = 
        var view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = .gray
        view.alpha = 0.3
        view.isHidden = true
        return view
    ()



    let tableView: UITableView = 
        let tableView = UITableView(frame: .zero, style: .grouped)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "commonCell")
        tableView.register(Save.self, forCellReuseIdentifier: "btnCell")
        tableView.register(Switcher.self, forCellReuseIdentifier: "switcherCell")
        tableView.headerView(forSection: 0)?.textLabel?.text = "settings of app"
        tableView.tableFooterView = UIView()
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = UITableViewAutomaticDimension
        tableView.allowsSelection = false
        return tableView
    ()

    override func viewDidLoad() 
        super.viewDidLoad()
        setupViews()
    

    func setupViews() 
        view.backgroundColor = .white
        view.addSubview(tableView)

        tableView.dataSource = self
        tableView.delegate = self

        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true


    

    override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(true)
        tabBarController?.navigationItem.rightBarButtonItems = []
        tabBarController?.navigationItem.title = "settings"
    

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return settings.count
    

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
        return "settings"
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        var cell = tableView.dequeueReusableCell(withIdentifier: "commonCell", for: indexPath)
        cell.textLabel?.text = settings[indexPath.row]
        if(indexPath.row == 6) 
            cell.textLabel?.text = ""
            cell = tableView.dequeueReusableCell(withIdentifier: "btnCell", for: indexPath)
        
        return cell
    



已解决

除了Sh_Khan回答,还需要设置

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 65

在桌子上

【问题讨论】:

【参考方案1】:

在我看来,您的单元类中的代码看起来没有什么问题。你能添加你的tableviewcode吗?

【讨论】:

我看到你投了 view.translatesAutoresizingMaskIntoConstraints = false 两次。尝试在 setupViews() 中删除那个 我尝试运行您的代码(除了类 Switch),它在为我删除 setupViews 中的 autordranslte 时有效。我希望这样做可以解决问题!【参考方案2】:

你应该实现

heightForRowAt

或添加

containerView.heightAnchor.constraint(equalToConstant:200).isActive = true

还将任何子视图添加到contentView

contentView.addSubview(containerView)
NSLayoutConstraint.activate([ 
    containerView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
    containerView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
    containerView.topAnchor.constraint(equalTo: contentView.topAnchor),
    containerView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
    containerView.heightAnchor.constraint(equalToConstant:200)
])  

【讨论】:

这会是self.translatesAutoresizingMaskIntoConstraints = false 代码中的另一个问题吗?我认为它会忽略高度限制。 Sh_Khan,两种方法都试过了,但由于某种原因,它们都不起作用,怀疑在声明表时出现问题,附加代码,我将不胜感激得到任何帮助或提示 谢谢您,在您的帮助下,通过设置rowHeight = UITableViewAutomaticDimension 和固定estimatedRowHeight = 65 解决了

以上是关于如何以编程方式在 UITableViewCell 中添加自定义视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中以编程方式更改自定义 UITableViewCell 中按钮的背景颜色?

我如何以编程方式将 uicollectionview 放在扩展的 uitableviewcell 中

如何在标准 UITableViewCell 中以编程方式自动布局右侧的自定义 UIButton。

如何使用自动调整其高度的 SnapKit 以编程方式创建 UITableViewCell?

如何以编程方式使 UICollectionView 填充 UITableViewCell?

在 Swift 中以编程方式突出显示 UITableViewCell