SwiftUI textFieldStyle 修饰符 RoundedBorderTextFieldStyle 和 PlainTextFieldStyle 之间的类型不匹配

Posted

技术标签:

【中文标题】SwiftUI textFieldStyle 修饰符 RoundedBorderTextFieldStyle 和 PlainTextFieldStyle 之间的类型不匹配【英文标题】:Type mismatch between SwiftUI textFieldStyle modifiers RoundedBorderTextFieldStyle and PlainTextFieldStyle 【发布时间】:2020-07-08 11:26:28 【问题描述】:

我正在尝试根据我的View 是否正在编辑,将.textFieldStyle 修饰符更改为TextField。我声明var isEditing: Bool,在父View 中设置它,并在body 中检查它。我的代码:

TextField("Type a Name", text: $name) 
    myManagedObjectObserved.attribute = name

.textFieldStyle(isEditing ? RoundedBorderTextFieldStyle() : PlainTextFieldStyle())

编译器抱怨以下构建时错误...

'? 中的结果值:' 表达式的类型不匹配 'RoundedBorderTextFieldStyle' 和 'PlainTextFieldStyle'

不明白为什么?谁能解释一下?

【问题讨论】:

【参考方案1】:

它们是不同的类型,所以快速类型检查会报告错误。

这是可能的解决方案(使用 Xcode 12 测试)

@ViewBuilder
var body: some View 
    if isEditing 
        TextField("Type a Name", text: $name) 
            myManagedObjectObserved = name
        
        .textFieldStyle(RoundedBorderTextFieldStyle())
     else 
        TextField("Type a Name", text: $name) 
            myManagedObjectObserved = name
        
        .textFieldStyle(PlainTextFieldStyle())
    

更新:更方便的变体(思路相同)

extension TextField 
    @ViewBuilder
    func editingStyle(if flag: Bool) -> some View 
        if flag 
            self.textFieldStyle(RoundedBorderTextFieldStyle())
         else 
            self.textFieldStyle(PlainTextFieldStyle())
        
    


struct TestView: View 
    @State private var name = ""
    @State private var isEditing = false

    @ViewBuilder
    var body: some View 
        TextField("Type a Name", text: $name) 
            myManagedObjectObserved = name
        
        .editingStyle(if: isEditing)
    

【讨论】:

感谢您及时回复 Asperi。您的答案正是我之前设置代码结构的方式(我可能应该将其包含在我的上下文问题中),但是我正在尝试简化我的代码 为开关的更改设置动画在 isEditing = true 和 isEditing = false 之间。另外,如果我阅读 Apple 文档,它们都是 TextFieldStyle 类型,所以这让我感到困惑。 @andrewbuilder, TextFieldStyle 是一种协议,而不是一种类型。它在 textFieldStyle 修饰符中用作泛型限制,因此需要具体类型 - 单一。 啊……是的,谢谢你现在明白了。此外,您使用 TextField 扩展的更新动画也很流畅,因为它不会删除一个视图并创建另一个视图并更改为 var isEditing

以上是关于SwiftUI textFieldStyle 修饰符 RoundedBorderTextFieldStyle 和 PlainTextFieldStyle 之间的类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中设置 TextField 的宽度

用户点击字段时如何将 textFieldStyle 切换为 TextField?

为啥修饰符顺序在 SwiftUI 中很重要? [复制]

SwiftUI:数组内的修饰符

SwiftUI:如何仅将修饰符应用于特定元素?

为啥 swipeActions 修饰符不能直接与 List 容器一起使用? #SwiftUI