我正在学习开发一个应用程序。我使用了一个空的UIStack视图,我将通过代码填充它。为此,我创建了一个Helper类(type327.swift(。该类返回一个包含三个子堆栈视图的堆栈视图。其中一个子视图是具有UITextfields的Stackwiew。我想修改手机上的值,但文本字段似乎不可编辑。我做错了什么,或者我的逻辑故障在哪里?
327类:
let unit: String?
let labelVCurrentText: UILabel! = {
let label = UILabel()
// label.text = "Label 1"
// label.font = .systemFont(ofSize: 14, weight: .regular)
// label.numberOfLines = 1
// label.backgroundColor = .clear
// label.textAlignment = .left
// //label.sizeToFit()
return label
}()
let labelVNomText: UILabel = {
let label = UILabel()
// label.text = "Label 1"
// label.font = .systemFont(ofSize: 14, weight: .bold)
// label.numberOfLines = 1
// label.backgroundColor = .clear
// label.textAlignment = .left
// label.sizeToFit()
return label
}()
let labelAimRelativText: UILabel = {
let label = UILabel()
// label.text = "Label 1"
// label.font = .systemFont(ofSize: 14, weight: .bold)
// label.numberOfLines = 1
// label.backgroundColor = .clear
// label.textAlignment = .left
// label.sizeToFit()
return label
}()
let labelVMaxRelativeText: UILabel = {
let label = UILabel()
// label.text = "Label 1"
// label.font = .systemFont(ofSize: 14, weight: .bold)
// label.numberOfLines = 1
// label.backgroundColor = .clear
// label.textAlignment = .left
// label.sizeToFit()
return label
}()
let labelVMinRelativeText: UILabel = {
let label = UILabel()
// label.text = "Label 1"
// label.font = .systemFont(ofSize: 14, weight: .bold)
// label.numberOfLines = 1
// label.backgroundColor = .clear
// label.textAlignment = .left
// label.sizeToFit()
return label
}()
let labelVBtwRelativeText: UILabel = {
let label = UILabel()
// label.text = "Label 1"
// label.font = .systemFont(ofSize: 14, weight: .bold)
// label.numberOfLines = 1
// label.backgroundColor = .clear
// label.textAlignment = .left
// label.sizeToFit()
return label
}()
let labelVAimAbsolutText: UILabel = {
let label = UILabel()
// label.text = "Label 1"
// label.font = .systemFont(ofSize: 14, weight: .bold)
// label.numberOfLines = 1
// label.backgroundColor = .clear
// label.textAlignment = .left
// label.sizeToFit()
return label
}()
let labelVMaxAbsolutText: UILabel = {let label = UILabel()
label.text = "Label 1"
// label.font = .systemFont(ofSize: 14, weight: .bold)
// label.numberOfLines = 1
// label.backgroundColor = .clear
// label.textAlignment = .left
// label.sizeToFit()
return label}()
let labelVMinAbsolutText: UILabel = {
let label = UILabel()
// label.text = "Label 1"
// label.font = .systemFont(ofSize: 14, weight: .bold)
// label.numberOfLines = 1
// label.backgroundColor = .clear
// label.textAlignment = .left
// label.sizeToFit()
return label
}()
let labelVBtwAbsolutText: UILabel = {
let label = UILabel()
return label
}()
let txtVCurrentValue: UITextField = {
let box = UITextField()
box.keyboardType = .decimalPad
box.isEditable
return box
}()
let txtVNomValue: UITextField = {
let box = UITextField()
box.keyboardType = .decimalPad
return box
}()
let txtAimRelativValue: UITextField = {
let box = UITextField()
box.keyboardType = .decimalPad
return box
}()
let txtVMaxRelativeValue: UITextField = {
let box = UITextField()
box.keyboardType = .decimalPad
return box
}()
let txtVMinRelativeValue: UITextField = {
let box = UITextField()
box.keyboardType = .decimalPad
return box
}()
let txtVBtwRelativeValue: UITextField = {
let box = UITextField()
box.keyboardType = .decimalPad
return box
}()
let txtVAimAbsolutValue: UITextField = {
let box = UITextField()
box.keyboardType = .decimalPad
return box
}()
let txtVMaxAbsolutValue: UITextField = {
let box = UITextField()
box.backgroundColor = .systemBlue
box.keyboardType = .decimalPad
return box
}()
let txtVMinAbsolutValue: UITextField = {
let box = UITextField()
box.keyboardType = .decimalPad
return box
}()
let txtVBtwAbsolutValue: UITextField = {
let box = UITextField()
box.keyboardType = .decimalPad
return box
}()
init(){
labelVCurrentText.text = "∆ p@Vnom"
labelVNomText.text = "Vnom"
labelAimRelativText.text = "Target value rel."
labelVMaxRelativeText.text = "VMax relativ"
labelVMinRelativeText.text = "VMin relativ"
labelVBtwRelativeText.text = "Vbtw realtiv"
labelVAimAbsolutText.text = "Target value abs."
labelVMaxAbsolutText.text = "VMax absolut"
labelVMinAbsolutText.text = "VMin absolut"
labelVBtwAbsolutText.text = "Vbtw absolut"
txtVNomValue.text = String(0)
txtVCurrentValue.text = String(0)
txtAimRelativValue.text = String(0)
txtVMaxRelativeValue.text = String(0)
txtVMinRelativeValue.text = String(0)
txtVBtwRelativeValue.text = String(0)
txtVAimAbsolutValue.text = String(0)
txtVMaxAbsolutValue.text = String(0)
txtVMinAbsolutValue.text = String(0)
txtVBtwAbsolutValue.text = String(0)
unit = "m3/h"
}
lazy var viewText: UIStackView = {
//MARK: - Textlabels for 327-View
let labelText: [UILabel] = [labelVCurrentText, labelVNomText, labelAimRelativText, labelVMaxRelativeText, labelVMinRelativeText, labelVBtwRelativeText, labelVAimAbsolutText, labelVMaxAbsolutText, labelVMinAbsolutText, labelVBtwAbsolutText]
for label in labelText {
label.textAlignment = .left
}
let stackView = UIStackView(arrangedSubviews: labelText)
stackView.axis = .vertical
stackView.spacing = 10
return stackView
}()
lazy var viewUnit: UIStackView = {
//MARK: - UnitLabels for 327-View
let labelVCurrentUnit = UILabel()
labelVCurrentUnit.text = "Pa"
let labelVNomUnit = UILabel()
labelVNomUnit.text = "m3/h"
let labelAimRelativUnit = UILabel()
labelAimRelativUnit.text = "%"
let labelVMaxRelativeUnit = UILabel()
labelVMaxRelativeUnit.text = "%"
let labelVMinRelativeUnit = UILabel()
labelVMinRelativeUnit.text = "%"
let labelVBtwRelativeUnit = UILabel()
labelVBtwRelativeUnit.text = "%"
let labelVAimAbsolutUnit = UILabel()
labelVAimAbsolutUnit.text = "m3/h"
let labelVMaxAbsolutUnit = UILabel()
labelVMaxAbsolutUnit.text = "m3/h"
let labelVMinAbsolutUnit = UILabel()
labelVMinAbsolutUnit.text = "m3/h"
let labelVBtwAbsolutUnit = UILabel()
labelVBtwAbsolutUnit.text = "m3/h"
let labelUnit: [UILabel] = [labelVCurrentUnit, labelVNomUnit, labelAimRelativUnit, labelVMaxRelativeUnit, labelVMinRelativeUnit, labelVBtwRelativeUnit, labelVAimAbsolutUnit, labelVMaxAbsolutUnit, labelVMinAbsolutUnit, labelVBtwAbsolutUnit]
for label in labelUnit {
label.textAlignment = .left
}
let stackView = UIStackView(arrangedSubviews: labelUnit)
stackView.axis = .vertical
stackView.spacing = 10
return stackView
}()
lazy var viewValue: UIStackView = {
//MARK: - Textlabels for 327-View
let boxValue: [UITextField] = [txtVCurrentValue, txtVNomValue, txtAimRelativValue, txtVMaxRelativeValue, txtVMinRelativeValue, txtVBtwRelativeValue, txtVAimAbsolutValue, txtVMaxAbsolutValue, txtVMinAbsolutValue, txtVBtwAbsolutValue]
// for label in labelValue {
// label.textAlignment = .left
// label.text = "n/a"
// }
let stackView = UIStackView(arrangedSubviews: boxValue)
stackView.axis = .vertical
stackView.spacing = 10
return stackView
}()
func setupStackViews() -> UIStackView {
let stackView = UIStackView(arrangedSubviews: [viewText, viewValue, viewUnit])
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.alignment = .fill
stackView.spacing = 10
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}
}
在控制器中调用创建的StackView:
override func viewDidLoad() {
super.viewDidLoad()
for label in viewLabels {
label.text = "n/a"
}
viewState = .disconnected
labelTitle.text = device?.name
baseActuator = BaseActuator(modbus: mod)
viewLabels = [labelProductnumber, labelActuatorIdent, labelSerialnumber, labelSoftwareVersion, labelActuatorType]
AddLabelToQueue()
lineChart.addSubview(lineChartView)
lineChartView.centerInSuperview()
lineChartView.width(to: lineChart)
lineChartView.height(to: lineChart)
setData()
refreshControll.addTarget(self, action: #selector(DidRefreshView(_:)), for: .valueChanged)
actuatorDataStackView.addSubview(type.setupStackViews())
}
你能帮我解释一下我做错了什么吗?
BR,怪异的
屏幕截图iPhone
情节提要
第一个注意:当我们不能使用您的代码时,很难提供帮助"照原样"值得回顾的是最小再现性示例
第二个注意事项:根据你的代码和故事板的图像,它看起来是一个布局问题。
灰色视图顶部和底部的红线表示您缺少一些约束。很可能,它没有"高度"约束。
这不一定是个问题,但你打电话给:
actuatorDataStackView.addSubview(type.setupStackViews())
而不对添加的堆栈视图设置任何约束。
如果您注意到应用程序的屏幕截图正在运行,则故事板中视图的灰色背景不会显示。如果随后使用Debug View Hierarchy
,您将看到灰色视图的"高度"为零,并且添加的堆栈视图延伸到灰色视图的边界之外。
如果UI元素(如UITextField
(在其超视图的边界之外,则不能与之交互。
在情节提要中,选择灰色视图并打开Clips to Bounds
(选中复选框。
如果你运行该应用程序,你可能甚至看不到你添加的堆栈视图。
假设是这样的话,试着添加这样的堆栈视图:
let v = type.setupStackViews()
v.translatesAutoresizingMaskIntoConstraints = false
actuatorDataStackView.addSubview(v)
NSLayoutConstraint.activate([
v.topAnchor.constraint(equalTo: actuatorDataStackView.topAnchor),
v.leadingAnchor.constraint(equalTo: actuatorDataStackView.leadingAnchor),
v.trailingAnchor.constraint(equalTo: actuatorDataStackView.trailingAnchor),
v.bottomAnchor.constraint(equalTo: actuatorDataStackView.bottomAnchor),
])
这将导致灰色视图增长到添加的堆栈视图的大小。