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 之间的类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章