簡體   English   中英

SwiftUI 顯示 Picker 項的 Persistent Value 作為 Picker 顯示時的突出顯示選項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM