ios 了解SwiftData和绑定/更新,一个简单的例子

n3h0vuf2  于 11个月前  发布在  iOS
关注(0)|答案(1)|浏览(88)

在做this code-along时,我试图通过一个简单的例子来验证我对SwiftData的了解。
这是可行的:

import SwiftUI

@main
struct WWPDApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                
        }
        // this makes modelContext available in the app
        .modelContainer(for: Memo.self)
    }
}

struct ContentView: View {
    // for getting swiftdata
    @Query private var memos: [Memo]
    // for setting swiftdata
    @Environment(\.modelContext) var modelContext
    
    var body: some View {
        
        VStack {
            Button("ADD MEMO") {
                modelContext.insert(Memo(name: "new memo"))
            }
            List(memos) {memo in
                Text(memo.name)
            }
        }
        .padding()
    }
}

// Putting "@Model" here makes this class work with swift data
@Model
final class Memo {
    
    var id: UUID
    var name: String
    
    init(id: UUID = UUID(), name: String) {
        self.id = id
        self.name = name
    }
    
}

字符串
这会起作用,并验证我们是否可以添加新对象并保存它们。
但是,我想验证和理解编辑/绑定方面。
我知道modelContext只用于插入一个新的对象。对于编辑一个现有的对象,我们将依赖于与查询数组(?)中包含的对象的双向绑定。
所以我试了一下:

struct ContentView: View {
    // for getting swiftdata
    @Query private var memos: [Memo]
    // for setting swiftdata
    @Environment(\.modelContext) var modelContext
    
    var body: some View {
        
        // need to put some kind of @Bindable thingy here
        
        VStack {
            Button("ADD MEMO") {
                modelContext.insert(Memo(name: "new memo"))
            }
            List(memos) {memo in
                TextField("this doesn't work", text: memo.$name)
            }
        }
        .padding()
    }
}

xiozqbni

xiozqbni1#

@Model final class Memo ...通过添加对Observable协议的一致性来实现类的更改跟踪。因此,当您想要为memo.name绑定时,您可以使用@Bindable,如示例代码所示。

struct ContentView: View {
    // for getting swiftdata
    @Query private var memos: [Memo]
    // for setting swiftdata
    @Environment(\.modelContext) var modelContext
    
    var body: some View {
        VStack {
            Button("ADD MEMO") {
                modelContext.insert(Memo(name: "new memo"))
            }
            List(memos) { memo in
                @Bindable var memo = memo  // <--- here
                TextField("this works", text: $memo.name)  // <--- here
            }
        }
        .padding()
    }
}

字符串

相关问题