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
相关产品推荐
相关产品推荐

