【发布时间】:2021-12-04 12:09:57
【问题描述】:
我需要一个适用于 MacOS 的 SwiftUI 多行文本输入控件,满足以下要求:
- 允许像在编辑器中一样进行光标控制(即按 RETURN 会导致换行)
- 表单中的工作标签
我尝试使用带有 lineLimit() 修饰符的 TextField,它看起来完全符合我的需要,即标签显示正确(包括对齐),但如果它为空且 RETURN 键没有,则它只有 1 行的高度t 做我想做的事(即换行):
struct ContentView: View {
@State var field1 = ""
@State var field2 = ""
@State var notes = ""
var body: some View {
Form {
TextField("Label", text: $field1)
TextField("Long Label", text: $field2)
TextField("Notes", text: $notes)
.lineLimit(10)
}
.padding()
.frame(height: 150)
}
}
然后我尝试了一个 TextEditor,但这缺乏定义标签的能力。标签的位置使得 Form 元素对 MacOS 非常有用,因为它允许标签的正确对齐而没有任何黑客攻击。缺少边框样式只是一个小问题,可以使用边框样式解决:
struct ContentView: View {
@State var field1 = ""
@State var field2 = ""
@State var notes = ""
var body: some View {
Form {
TextField("Label", text: $field1)
TextField("Long Label", text: $field2)
TextEditor(text: $notes)
}
.padding()
.frame(height: 150)
}
}
我只对面向未来的干净解决方案感兴趣。如果没有,hack 必须至少非常灵活,即所有标签必须正确对齐。 workingdog 的解决方案不适合我,因为一旦标签文本发生变化,一切都会崩溃。
【问题讨论】:
-
您可以尝试使用
HStack,例如:HStack { Text("Note") TextEditor(text: $notes) }为您的文本编辑器获取“标签”。 -
不幸的是,这并不容易。标签将与其他文本字段左对齐,注释字段将被插入。 “表单”以某种方式识别“真实”文本字段的标签并执行所有对齐操作。但不适用于 HStack 中的自构建标签。