SwiftUI 绑定到 foreach 内的核心数据对象

AAV*_*AAV 3 core-data swiftui combine

我无法将 core Data 对象中的 bookName 绑定到循环内的 TextField ForEach。我怎样才能让这个绑定工作?我希望该bookName值在更改时保存到核心数据中。

我收到一条错误消息:无法在范围内找到 $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
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

dav*_*dev 6

我喜欢 CoreData 和 SwiftUI。它的工作原理就是这么简单。ObservedObject只需使用Book创建一个新的编辑视图即可。

struct EditView : View {
    @ObservedObject var book: Book
    
    init(book: Book) {
        self.book = book
    }
    
    var body : some View {
        TextField("Name", text: $book.bookName)
    }
}
Run Code Online (Sandbox Code Playgroud)

就是这样。然后您可以$book.bookName作为绑定发送到字符串。

但是,请确保!您已将 bookName 声明为 CoreData 中的非可选值。TextField 需要 a Binding<String>,而不是 aBinding<String?>

在 ForEach 中使用 EditView 就可以开始了:

ForEach(books) { book in
    EditView(book: book)
Run Code Online (Sandbox Code Playgroud)