core-data - SwiftUI 绑定到 foreach 中的核心数据对象
问题描述
我无法将核心数据对象中的 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
}
}
}
解决方案
我喜欢使用 SwiftUI 的 CoreData。它的工作原理就是这么简单。只需使用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 需要 a Binding<String>
,而不是 aBinding<String?>
在您的 ForEach 中使用该 EditView,您就可以开始了:
ForEach(books) { book in
EditView(book: book)
推荐阅读
- javascript - 控制台执行的脚本运行但 tabs.executescript 没有
- javascript - 如何使 Discord.js-commando 命令只能由具有我提供的用户 ID 的人使用?
- android - 蓝牙连接线程在连接后立即关闭套接字
- javascript - 无法在 javascript 中显示叠加层,但可以在 jquery 中显示
- ios - 如何在不使用 UINavigationController 的情况下以编程方式进入 rootViewController
- gradle - IntelliJ 项目“JS 客户端和 JVM 服务器 | Gradle”不起作用
- sql - 记录访问性能明智
- python - 如果我可以根据需要在 __init__ 之后简单地添加尽可能多的 self.agrument,为什么类需要参数(参数)?
- vue.js - 如何通过延迟加载将组件放置在标题中?
- java - MacO 上文件夹和文件的本机文件对话框