[英]SwiftUI Show Persistent Value of Picker Item as the Highlighted Choice When Picker Displayed
我在 SwiftUI 應用程序中有幾個選擇器,其中選擇器項目存儲在核心數據中。 每個 Picker 項只有一個標題:String 和一個注釋:String。
App 有 List 和 DetailView 格式,在 DetailView 中有 Picker。 我使用 @State 變量來指示是否正在編輯。 如果 isEditing 為 false,則文本字段會顯示存儲的選項。 如果 isEditing 為真,則顯示選取器。 這一切都很好,除了將 isEditing 設置為 true 會顯示來自數據支持的項目 0 的選擇器。 真正的價值仍然在 Core Data 中,但在用戶看來,選擇已被覆蓋。
我創建了一個自定義綁定來設置用戶選擇:
var spinner1Binding: Binding<Int> {
Binding(
get: { self.selectionIndex1 },
set: {
self.selectionIndex1 = $0
self.picker1Text = picker1ListVM.picker1Items[self.selectionIndex1].picker1Title
patientDetailVM.pubSpinner1 = picker1ListVM.picker1Items[self.selectionIndex1].picker1Title
})}
視圖 model picker1Items 是 Picker1Model 的數組
struct Picker1Model: Identifiable {
let picker1Item: Picker1Item
var id: NSManagedObjectID {
return picker1Item.objectID
}
var picker1Title: String {
return picker1Item.title ?? "No Picker 1 Title"
}
var picker1Comment: String {
return picker1Item.comment ?? "No Picker 1 Comment"
}
}//picker 1 model
這是 DetailView 中的代碼。 我只添加了第二個文本來說明真正的價值仍然是發布的價值:
VStack {
Text(appSpinner1Title + ":")
.modifier(LabelTextSetup())
//Remove this when problem solved
Text(isEditing ? "Current: \(patientDetailVM.pubSpinner1)" : "")
.modifier(LabelTextSetup())
}
Spacer()
if isEditing {
Picker(selection: spinner1Binding, label : Text("Picker One Choice")) {
ForEach(picker1ListVM.picker1Items.indices, id: \.self) { index in
Text(picker1ListVM.picker1Items[index].picker1Title).tag(index)
}//for
}//picker
} else {
Text(patientDetailVM.pubSpinner1)
.modifier(LabelTextSetup())
}
不編輯時,它看起來像這樣:
編輯時看起來像這樣。 顯然,我想要的是讓選擇器在這種情況下顯示“Urgently Ortho”。
看起來這應該很容易,但我還沒有成功。
任何指導將不勝感激。 Xcode 13.2.1 iOS 15
問題是,當我創建 Picker 時,我無法將 Picker 項目的選擇設置為顯示為當前項目(來自 Core Data)。 我認為我應該能夠在 Picker 的自定義綁定中做到這一點,但我無法讓任何東西正常工作。
我的解決方案是創建一個 function 來收集存儲在 Core Data 中的當前值,並在創建 Picker 時執行該 function。 它有效,但似乎應該有更好的方法。
func setSelection1() {
for x in 0..<picker1ListVM.picker1Items.count {
if picker1ListVM.picker1Items[x].picker1Title == patientDetailVM.pubSpinner1 {
selectionIndex1 = x
}//if
}//for in
}//set selection
然后也在顯示 Picker 的視圖中,調用 function in.onAppear:
Picker(selection: spinner1Binding, label : Text("Picker One Choice")) {
ForEach(picker1ListVM.picker1Items.indices, id: \.self) { index in
Text(picker1ListVM.picker1Items[index].picker1Title).tag(index)
}//for
}//picker
.onAppear {
setSelection1()
}
希望這對其他人有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.