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

Core data SwiftUI绑定到foreach内部的核心数据对象,core-data,swiftui,combine,Core Data,Swiftui,Combine,我无法将核心数据对象中的bookName绑定到ForEach循环中的TextField。我怎样才能使这个装订工作?我希望bookName值在更改时保存到核心数据 我收到一个错误,提示:在范围中找不到$book extension Book: Identifiable { @nonobjc public class func fetchRequest() -> NSFetchRequest<Book> { r

我无法将核心数据对象中的bookName绑定到ForEach循环中的TextField。我怎样才能使这个装订工作?我希望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
                    }
                 }
    }
扩展手册:可识别{
@nonobjc公共类func fetchRequest()->NSFetchRequest{
返回NSFetchRequest(entityName:“Book”)
}
@NSManaged公共变量id:UUID?
@NSManaged public var bookName:字符串?
var wrappedBookName:String{
书名??“
}
}    
结构BookListView:视图{
@FetchRequest(实体:Book.entity(),SortDescriptor:[NSSortDescriptor(键路径:\Book.rankNumber,升序:false)])var books:FetchedResults
var body:一些观点{
ForEach(books){book in
TextField(“Book Name”,text:$Book.bookName)//错误:在作用域中找不到$Book
}
}
}

我喜欢带SwiftUI的CoreData。它就是这么简单。只需使用Book的
ObservedObject
创建一个新的编辑视图

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需要
绑定
,而不是
绑定

在ForEach中使用该EditView,即可开始:

ForEach(books) { book in
    EditView(book: book)