昨天稍微介紹了刪除的方法,剩下的就是 Update 了。
在 Update 前需要知道要更改的是哪一筆資料,所以這裡對著原本的 View 再加上一些東西。
這裡先建立一個新的變數用來儲存要更改的那筆資料,前面在加上 @State。
@State private var expenseToEdit: Expense?
在這之後在產生一個用來更改值的 View,可以看到這裡用了 @Bindable 這個 Property Wrapper 來表示這個變數是可以綁定的,這樣在進入這個畫面時就能將這個變數跟主畫面的資料綁定在一起了。
struct UpdateExpenseSheet: View {
@Environment(\.dismiss) private var dismiss
@Bindable var expense: Expense
var body: some View {
NavigationStack {
Form {
TextField("Expense name", text: $expense.name)
DatePicker("Date", selection: $expense.date, displayedComponents: .date)
TextField("value", value: $expense.value, format: .currency(code: "USD"))
.keyboardType(.decimalPad)
}
.navigationTitle("Update Expense")
.navigationBarTitleDisplayMode(.large)
.toolbar {
ToolbarItemGroup(placement: .topBarLeading) {
Button("Done") {
dismiss()
}
}
}
}
}
}
接下來在 Cell 上加上這些,就能將點擊到的 Cell 裡的資料丟進變數裡。
ExpenseCell(expense: expense)
.onTapGesture {
expenseToEdit = expense
}
最後在原本的 List 下面在加上這些,就能在 Cell 被點擊的時候跳到更改值的畫面,同時帶著要更改的值一起。
.sheet(item: $expenseToEdit) { expense in
UpdateExpenseSheet(expense: expense)
}
這樣就能順利的更改裡面的資料了,明天來介紹這幾天一直提到的 Macro 吧。