【问题标题】:SwiftUI Bind to core data object inside foreachSwiftUI 绑定到 foreach 中的核心数据对象
【发布时间】:2020-11-21 22:26:29
【问题描述】:

我无法将核心数据对象中的 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
                    }
                 }
    }

【问题讨论】:

    标签: core-data swiftui combine


    【解决方案1】:

    我喜欢带有 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 需要Binding&lt;String&gt;,而不是Binding&lt;String?&gt;

    在你的 ForEach 中使用那个 EditView,你就可以开始了:

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

    【讨论】:

    • 刚刚尝试将字段更改为非可选并将默认文本设置为某些内容或空字符串(在核心数据属性的属性检查器中)。仍然看到 Binding 转换错误。做了一个干净的构建并退出 Xcode (13.2.1)。就好像视图仍然认为核心数据定义尚未更新。到目前为止,唯一的解决方案是使用这种展开技术。 stackoverflow.com/questions/68543882/…
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多