如何正确设置 SwiftUI TextEditor 的样式

问题描述 投票:0回答:1

我正在开发一个带有用户表单的应用程序,我想将我的

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
...

的概念感到非常挣扎。
macos swiftui textfield swiftui-texteditor
1个回答
0
投票

简短回答:

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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.