我正在开发一个带有用户表单的应用程序,我想将我的
TextField
和 TextEditor
实例设置为相同的样式。前者看起来很简单,但我不相信我正确构建了后者(Apple 文档建议使用类似下面的内容):
private struct FlippableFieldEditorStyle: TextEditorStyle {
@Binding var isBordered: Bool
@Binding var text: String
func makeBody(configuration: Configuration) -> some View {
TextEditor(text: $text)
.frame(maxHeight: 100)
.modifier(BaseTextEntryModifier(isBordered: $isBordered))
}
}
并使用它:
TextEditor(text: $textEntryBinding)
.textEditorStyle(FlippableFieldEditorStyle(isBordered: $isEditing,
text: $textEntryBinding))
但这不可能是正确的,不是吗?我似乎必须通过
textEntryBinding
iVar 两次。如何访问 TextEditorStyle
代码中的绑定变量?我尝试过使用:
private struct FlippableFieldStyle: TextEditorStyle {
@Binding var isBordered: Bool
func _body(configuration: TextField<Self._Label>) -> some View {
configuration.modifier(BaseTextEntryModifier(isBordered: $isBordered))
}
}
这就像
TextFieldStyle
一样,但这不会编译。我承认我对 Configuration
... 的概念感到非常挣扎。
简短回答:
TextFieldStyle
尚未准备好用于生产,并且 TextEditorStyle
不完整。
长答案:
TextFieldStyle
的 _body
仍然是 private
API(不用于生产),并且 TextEditorStyle
可在公共 API 中使用,但不会像其他样式那样提供“值”。
其他样式通过
configuration
发挥其价值,例如 ToggleStyle
private struct FlippableFieldStyle: ToggleStyle {
func makeBody(configuration: Configuration) -> some View {
switch configuration.isOn {
case true:
configuration.label
.tint(.gray)
case false:
configuration.label
.tint(.green)
}
}
}
您可以在`ToggleStyleConfiguration'
中找到所有可用的属性TextEditorStyle
是公共API,但TextEditorConfiguration
没有任何可用的属性。
private struct FlippableFieldStyle: TextEditorStyle {
func makeBody(configuration: Configuration) -> some View {
configuration.text //Nothing here to modify
}
}
您在样式中放置另一个
TextEditor
的解决方案是一种解决方法,但如果我们要挖掘,您现在可能在层次结构中有 2 个 TextEditor,即您正在设计样式的一个和您在样式中呈现的一个。
唯一可用的“正确”解决方案似乎是
TextEditor
的自定义视图
private struct FlippableFieldEditorStyle: View {
@Binding var isBordered: Bool
@Binding var text: String
var body: some View {
TextEditor(text: $text)
.frame(maxHeight: 100)
}
}