我需要一个适用于 MacOS 的 SwiftUI 多行文本输入控件,满足以下要求:
我尝试使用带有 lineLimit() 修饰符的 TextField,它看起来正是我需要的,即标签显示正确(包括对齐),但如果它是空的,并且 RETURN 键不执行任何操作,则它的高度只有 1 行我想要(即新行):
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)
}
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试了文本编辑器,但它缺乏定义标签的能力。标签的位置使得 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)
}
}
Run Code Online (Sandbox Code Playgroud)
我只对面向未来的干净解决方案感兴趣。如果没有,黑客至少必须非常灵活,即所有标签必须正确对齐。workingdog 的解决方案不适合我,因为一旦标签文本发生变化,一切都会崩溃。
这是一个部分解决方案,
Form
{
TextField("Title", text: .constant("Foo"))
LabeledContent("Label")
{
TextEditor(text: .constant("My\nText\nView"))
}
}
Run Code Online (Sandbox Code Playgroud)
“标签”一词将以正确对齐并垂直和水平对齐的形式出现在标签位置。
不幸的是,该TextEditor字段本身在垂直方向上稍微向下移动,并且我缺乏修复它的 SwiftUI 专业知识。如果我找到办法,我会修改我的答案。