如何使用picker中的核心数据值#SwiftUI#CoreData


struct PickerView: View {
var items0 : [PageName]
@State var selectedPage: PageName?
init(items0: [PageName]) {
self.items0 = items0
self._selectedPage = State(initialValue: items0.first)
}
var body: some View {
Picker(selection: $selectedPage, label: Text("Page")) {
ForEach(items0) { item in
Text(item.pageName ?? "").tag(item as PageName?)
}
}
Text("((selectedPage?.pageName)!)")
}



NavigationView {
Form {
PickerView(items0: Array(items0))
}
.foregroundColor(.blue)
.background(Color.yellow)
}

我可以在Picker中成功地选择核心数据的值,但我不知道如何在我的主视图中使用这个值。。。

我已经尝试了很多东西,但核心数据让我抓狂。

有人能帮我在SwiftUI中使用核心数据选择器的pickle值吗?

我误解了你的问题,我的原始评论如下。评论中有很多信息。

import SwiftUI
struct ParentPickerView: View {
@Environment(.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: PageName.pageName, ascending: true)],
animation: .default)
private var items0: FetchedResults<PageName>
//State is a source of truth
@State var selectedPage: PageName? = nil
var body: some View {
NavigationView {
Form {
Text(selectedPage?.pageName ?? "not selected")
PickerView(items0: Array(items0), selectedPage: $selectedPage)
}
.foregroundColor(.blue)
.background(Color.yellow)
}
}
}
struct PickerView: View {
//If you don't need all your PageName in your parentView it would be best to have the fetch here
//    @Environment(.managedObjectContext) private var viewContext
//    @FetchRequest(
//        sortDescriptors: [NSSortDescriptor(keyPath: PageName.pageName, ascending: true)],
//        animation: .default)
//    private var items0: FetchedResults<PageName>
var items0: [PageName]
//Binding is a two-way connection
@Binding var selectedPage: PageName?
//You don't need custom init in SwiftUI because they are struct
//    init(items0: [PageName], selectedPage: Binding<PageName?>) {
//        self.items0 = items0
//        self._selectedPage = selectedPage
//
//        //@State Init here is bad practice as you are experiencing it becomes a dead end
//        //self._selectedPage = State(initialValue: items0.first)
//    }
var body: some View {
Picker(selection: $selectedPage, label: Text("Page")) {
ForEach(items0) { item in
Text(item.pageName ?? "").tag(item as PageName?)
}
}
Text("((selectedPage?.pageName ?? "not selected"))")

.onAppear(){
//Set your initial item here only if the selected item is nil
if selectedPage == nil{
selectedPage = items0.first
}
}
}
}

最新更新