You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift:UIStackView内的UITextView无法显示问题求助

问题排查与修复方案

你的代码里有几个关键问题导致表格完全没有显示内容,我帮你逐一梳理并给出修复方案:

1. 未给StackView添加布局约束且视图层级错误

你把stackView直接加到了Cell本身,但既没设置约束,也违反了UITableViewCell的规范——自定义子视图必须添加到Cell的contentView上,否则会和Cell自带的辅助视图(比如选中态、编辑控件)冲突,且无法正确布局。

修改Cell的init方法:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    // 把stackView加到contentView而非Cell本身
    contentView.addSubview(stackView)
    // 关闭自动转译,启用AutoLayout
    stackView.translatesAutoresizingMaskIntoConstraints = false
    // 添加约束让stackView填满contentView(留边距更美观)
    NSLayoutConstraint.activate([
        stackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 8),
        stackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 8),
        stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -8),
        stackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -8)
    ])
}

2. 文本更新时机错误

你在layoutSubviews里更新TextView的文本,但layoutSubviews会在布局变化时被频繁调用,且当你设置Cell的firstColumn等属性时,并不会触发layoutSubviews,导致文本无法及时显示。应该给这些属性添加didSet观察者,属性值一改变就更新对应的TextView:

修改Cell的属性定义:

var firstColumn: String? {
    didSet {
        firstColumnView.text = firstColumn
    }
}
var secondColumn: String? {
    didSet {
        secondColumnView.text = secondColumn
    }
}
var thirdColumn: String? {
    didSet {
        thirdColumnView.text = thirdColumn
    }
}
var fourthColumn: String? {
    didSet {
        fourthColumnView.text = fourthColumn
    }
}

之后删除layoutSubviews里的文本设置代码,避免冗余触发。

3. 未设置TableView行高

默认UITableView行高是44,但你的Cell里包含TextView,可能需要更高的高度才能完整显示内容。在viewDidLoad里添加行高设置:

override func viewDidLoad() {
    super.viewDidLoad()
    data = [CellData.init(firstColumn: "Date", secondColumn: "Flight number", thirdColumn: "Type", fourthColumn: "Pre-refuel FOB (kg)")]
    tableView.register(FuelHistoryColumnCells.self, forCellReuseIdentifier: cellID)
    // 自动计算行高(推荐)
    tableView.rowHeight = UITableView.automaticDimension
    tableView.estimatedRowHeight = 60 // 给一个预估高度帮助布局计算
    // 也可以设置固定行高:tableView.rowHeight = 60
}

额外优化:禁用TextView的可编辑性

默认TextView是可编辑状态,这在表格Cell里通常不是期望行为,建议禁用:

lazy var firstColumnView: UITextView = {
    let textView = UITextView()
    textView.font = UIFont.systemFont(ofSize: 15)
    textView.backgroundColor = .green
    textView.isEditable = false // 禁止编辑
    textView.isScrollEnabled = false // 不需要滚动时禁用,避免Cell高度异常
    return textView
}()

其他三个TextView做同样修改即可。

应用以上修改后,你的4列表格就能正常显示内容了。

内容的提问来源于stack exchange,提问作者DevB1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:07:27