我发现无法在 SwiftUI 中使用核心数据,因为当我将核心数据传递给视图观察对象变量时,即使在视图消失后,导航链接视图也会保留对该对象的引用,因此一旦我删除了应用程序崩溃的上下文中的对象,没有错误消息。
我已经通过将核心数据对象变量作为可选变量包装到视图模型中来确认这一点,然后在上下文删除操作之后将对象设置为 nil 并且应用程序工作正常,但这不是解决方案,因为我需要核心数据对象绑定到 swift ui 视图并成为事实的来源。这应该如何工作?我真的不能用 SwiftUI 使任何远程复杂的东西看起来。
我尝试将传入的核心数据对象分配给可选的@State,但这不起作用。我不能使用 @Binding 因为它是一个获取的对象。而且我不能使用变量,因为 swiftui 控件需要绑定。使用@ObservedObject 才有意义,但这不能是可选的,这意味着当分配给它的对象被删除时,应用程序崩溃,因为我无法将其设置为 nil。
这里是核心数据对象,默认是一个可观察对象:
class Entry: NSManagedObject, Identifiable {
@NSManaged public var date: Date
}
Run Code Online (Sandbox Code Playgroud)
这是一个将核心数据条目对象传递给另一个视图的视图。
struct JournalView: View {
@Environment(\.managedObjectContext) private var context
@FetchRequest(
entity: Entry.entity(),
sortDescriptors: [],
predicate: nil,
animation: .default
) var entries: FetchedResults<Entry>
var body: some View {
NavigationView {
List {
ForEach(entries.indices) { index in
NavigationLink(destination: EntryView(entry: self.entries[index])) {
Text("Entry")
}
}.onDelete { indexSet in
for index in indexSet { …Run Code Online (Sandbox Code Playgroud) 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不支持它们似乎很奇怪