UITableView 只显示一个单元格

Posted

技术标签:

【中文标题】UITableView 只显示一个单元格【英文标题】:UITableView showing only one cell 【发布时间】:2018-09-26 15:07:01 【问题描述】:

我有一个带有多个数据单元格的UITableView,但加载时只显示一个单元格。为了测试,我在数组中添加了 4 个字符串。

class LoadingDataViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    @IBOutlet weak var tableViewDataLoading: UITableView!
    var dados = ["Vendas","Produtos","Pessoas","Animais"]
    
    override func viewDidLoad() 
        super.viewDidLoad()
        print("View did load")
        tableViewDataLoading.delegate = self
        tableViewDataLoading.dataSource = self
        tableViewDataLoading.layer.cornerRadius = 15.0
        tableViewDataLoading.layer.borderColor = UIColor.vorazColor.cgColor
        tableViewDataLoading.layer.borderWidth = 1.0
        tableViewDataLoading.clipsToBounds = true
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return dados.count
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "CellLoadingData") as! CellDataLoading
        print("CELL: \(indexPath.row) - \(dados[indexPath.row])")
        cell.lblDado.text = dados[indexPath.row]
        cell.indicatorDado.startAnimating()
        return cell
    
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
        let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: UITableViewAutomaticDimension))
        let label = UILabel(frame: headerView.frame)
        label.center = headerView.center
        headerView.backgroundColor = UIColor.vorazColor
        label.text = "Baixando dados..."
        label.textColor = UIColor.white
        headerView.addSubview(label)
        return headerView
    
    
    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? 
        let buttonCancel = UIButton(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: UITableViewAutomaticDimension))
        buttonCancel.backgroundColor = UIColor.vorazColor
        buttonCancel.setTitle("Cancelar", for: .normal)
        buttonCancel.addTarget(self, action: #selector(cancelar), for: .touchUpInside)
        return buttonCancel
    
    
    @objc func cancelar(_ sender : UIButton) 
        self.dismiss(animated: true, completion: )
    
    


class CellDataLoading : UITableViewCell 
    
    @IBOutlet weak var imgCheckDado: UIImageView!
    @IBOutlet weak var indicatorDado: UIActivityIndicatorView!
    @IBOutlet weak var lblDado: UILabel!
    
    override func awakeFromNib() 
        super.awakeFromNib()
    
    

结果:

故事板:

Obs.: header view的标签不显示,这个ViewController像popup一样呈现。

【问题讨论】:

我看到该视图底部附近的分隔线。您可以向下滚动以查看其他 3 个单元格吗?也许你需要让你的细胞的高度更窄? 是的,你没问题.. 但为什么不自动发生? 我固定了高度,但表格使用了更多需要的空间。 imgur.com/a/nMzWNnd 【参考方案1】:

这里有几个数字很重要。查看我的项目的屏幕截图:

我给这个表格一个明确的行高,在底部,我通过 AutoLayoutw 给表格一个固定的高度。

这些数字可能不适合您的项目,但如果您调整单元格的高度,我认为您会看到更好的结果。

【讨论】:

我固定了行高并且工作正常,但是TableView 的高度保留了更多的需要。 您可以通过单击表格视图然后添加高度约束来缩小表格视图。 高度取决于元素的数量 其他人havesolvedthisproblembefore.【参考方案2】:

虽然我比最近的一个项目更喜欢 Dhaval D 方法,主要是表格内容大小的观察者,但这是我在时间紧迫的情况下所做的。

表格视图位于容器视图中。容器视图对其有高度限制。表格视图被固定在容器视图的所有侧面。每当 tableview 数据发生变化时,我都会调用

func updateTableSize() 

        self.tableView.layoutIfNeeded()
        var tableFrame = tableView.frame
        tableFrame.size.height = tableView.contentSize.height
        tableFrame.size.width = tableView.contentSize.width 
        tableView.frame = tableFrame
        heightConstraint.constant = tableFrame.size.height
    

【讨论】:

这解决了我的问题,但是页脚和边框之间出现了小空白:imgur.com/a/clZOWrv @Augusto。您是否尝试过 Debug View Hierarchy 来查看空白区域的来源? developer.apple.com/library/archive/documentation/…【参考方案3】:

为你的 UITableView 设置高度限制并像下面这样使用它:

@IBOutlet weak var tableHeightConstraint: NSLayoutConstraint!
override func viewDidLoad() 
    super.viewDidLoad()

    tableViewDataLoading.delegate = self
    tableViewDataLoading.dataSource = self
    tableViewDataLoading.layer.cornerRadius = 15.0
    tableViewDataLoading.layer.borderColor = UIColor.vorazColor.cgColor
    tableViewDataLoading.layer.borderWidth = 1.0
    tableViewDataLoading.clipsToBounds = true

    // For dynamic height of cells if you need that otherwise only write `heightForRowAtIndexPath`
    tableViewDataLoading.estimatedRowHeight = 88.0
    tableViewDataLoading.rowHeight = UITableViewAutomaticDimension
    tableViewDataLoading.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.new, context: nil)



override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) 

    tableHeightConstraint.constant = tableViewDataLoading.contentSize.height
    UIView.animate(withDuration: 0.5) 
        self.updateConstraints()
        self.layoutIfNeeded()
    



func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    // For static height
    // return 40 // Here you can set your desired height 

    // For dynamic cell height 
    return UITableViewAutomaticDimension

【讨论】:

高度问题是关于整个 UITableView,而不是每一行。 从您的屏幕截图中我无法判断约束是否正确,您是否为 UITableView 设置了高度和宽度约束或顶部、底部、前导和尾随? 我已经更新了我的答案以根据 UITableView 的内容设置动态高度。 什么都不做。 您是否根据需要设置了高度、前导、尾随和垂直居中或顶部约束?

以上是关于UITableView 只显示一个单元格的主要内容,如果未能解决你的问题,请参考以下文章

数据未显示在 UITableView 的自定义单元格中

在 UITableView 单元格中定位 UIImageViews

UITableView 只显示一个单元格

UITableView 滚动到最后一个单元格只显示一半的单元格

UITableView 应该显示 2 个单元格时只显示 1 个单元格(Swift 3)

UITableView 单元格的动态高度问题(Swift)