SwiftUI 绑定到 foreach 内部的核心数据对象
SwiftUI Bind to core data object inside foreach
我无法将我的 Core Data 对象中的 bookName 绑定到 ForEach 循环内的 TextField。我怎样才能让这个绑定工作?我希望 bookName 值在更改时保存到 Core Data。
我收到一条错误消息:无法在范围内找到 $book。
extension Book: Identifiable {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Book> {
return NSFetchRequest<Book>(entityName: "Book")
}
@NSManaged public var id: UUID?
@NSManaged public var bookName: String?
var wrappedBookName: String {
bookName ?? ""
}
}
struct BookListView: View {
@FetchRequest(entity: Book.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Book.rankNumber, ascending: false)]) var books: FetchedResults<Book>
var body: some View {
ForEach(books) { book in
TextField("Book Name", text: $book.bookName) //Error: cannot find $book in scope
}
}
}
我喜欢 CoreData 和 SwiftUI。它的工作原理非常简单。只需使用 ObservedObject
of Book 创建一个新的编辑视图。
struct EditView : View {
@ObservedObject var book: Book
init(book: Book) {
self.book = book
}
var body : some View {
TextField("Name", text: $book.bookName)
}
}
就是这样。然后您可以将 $book.bookName
作为绑定发送到字符串。
但是,请确定!您已在 CoreData 中将 bookName 声明为非可选值。 TextField 需要 Binding<String>
,而不是 Binding<String?>
在您的 ForEach 中使用该 EditView,您就可以开始了:
ForEach(books) { book in
EditView(book: book)
我无法将我的 Core Data 对象中的 bookName 绑定到 ForEach 循环内的 TextField。我怎样才能让这个绑定工作?我希望 bookName 值在更改时保存到 Core Data。
我收到一条错误消息:无法在范围内找到 $book。
extension Book: Identifiable {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Book> {
return NSFetchRequest<Book>(entityName: "Book")
}
@NSManaged public var id: UUID?
@NSManaged public var bookName: String?
var wrappedBookName: String {
bookName ?? ""
}
}
struct BookListView: View {
@FetchRequest(entity: Book.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Book.rankNumber, ascending: false)]) var books: FetchedResults<Book>
var body: some View {
ForEach(books) { book in
TextField("Book Name", text: $book.bookName) //Error: cannot find $book in scope
}
}
}
我喜欢 CoreData 和 SwiftUI。它的工作原理非常简单。只需使用 ObservedObject
of Book 创建一个新的编辑视图。
struct EditView : View {
@ObservedObject var book: Book
init(book: Book) {
self.book = book
}
var body : some View {
TextField("Name", text: $book.bookName)
}
}
就是这样。然后您可以将 $book.bookName
作为绑定发送到字符串。
但是,请确定!您已在 CoreData 中将 bookName 声明为非可选值。 TextField 需要 Binding<String>
,而不是 Binding<String?>
在您的 ForEach 中使用该 EditView,您就可以开始了:
ForEach(books) { book in
EditView(book: book)