SwiftUI文本字段可以与可选绑定一起使用吗?当前此代码:
struct SOTestView : View {
@State var test: String? = "Test"
var body: some View {
TextField($test)
}
}
Run Code Online (Sandbox Code Playgroud)
产生以下错误:
无法将类型'Binding <String?>'的值转换为预期的参数类型'Binding <String>'
有没有办法解决?在数据模型中使用Optionals是一种非常常见的模式-实际上,这是Core Data中的默认设置,因此SwiftUI不支持它们似乎很奇怪
当我
title的String)MasterView实现更改为此struct MasterView: View {
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Event.timestamp, ascending: true)],
animation: .default)
var events: FetchedResults<Event>
@Environment(\.managedObjectContext)
var viewContext
var body: some View {
List {
ForEach(events, id: \.self) { event in
NavigationLink(
destination: DetailView(event: event)
) {
TextField("Title", text: Binding(ObservedObject<Event>(wrappedValue: event).projectedValue.title)!)
}
}.onDelete { indices in
self.events.delete(at: indices, from: self.viewContext)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
,即,使用与对象属性的适当绑定换出Textfor TextField,只要我不尝试从列表中删除,XCode 就会愉快地编译并且应用程序以预期的行为运行。titleevent
当我尝试删除 an 时Event,它会因此堆栈跟踪而崩溃 …
这是我的 SwiftUI 视图:
struct EditEntity: View {
@State var entity: Entity
var body: some View {
Form {
TextField("Entity Name", text: $entity.name)
}
}
}
Run Code Online (Sandbox Code Playgroud)
Entity是 Core Data 使用代码生成为我创建的对象。
以下是该实体在核心数据模型文件中的设置方式:
我遇到的问题是,当 SwiftUI 想要一个对象时,它$entity.name是一个对象。所以我收到这个编译错误:Binding<String?>Binding<String>
Cannot convert value of type 'Binding<String?>' to expected argument type 'Binding<String>'
那么有人知道最佳实践是什么吗?我应该在视图类中为该属性创建一个单独的非可选变量吗?从我的屏幕截图中可以看出,我将属性设置为不可选,希望它是一个非可选字符串,但显然这不起作用。
我发现基本上这个问题在这里问。答案是创建一个扩展。当尝试将 SwiftUI 与 Core Data 一起使用来完成如此基本的事情时,这真的是需要做的吗?