【问题标题】:How can I use Core Data value from picker? #SwiftUI #CoreData如何使用选择器中的核心数据值? #SwiftUI #CoreData
【发布时间】:2021-07-18 02:28:41
【问题描述】:
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 中成功选取 Core Data 的值,但是我不知道如何在我的主视图中使用这个值...

我已经尝试了很多东西,但 Core Data 让我发疯了。

有人可以帮我在 SwiftUI 中将选取器的选取值与 Core Data 一起使用吗?

【问题讨论】:

  • PageName 是您的核心数据对象吗?如果是这样,ForEach 中的内容应该引用一个单独的视图,你可以 @ObservedObject var pageName: PageName 这样你就可以观察到变化
  • @loremipsum 是的,PageName 是 Entities,pageName 是 String 属性。非常感谢你的回复。但我没明白...如果我把“@ObservedObject var pageName: PageName”放在某个地方,那么我也应该把它放在 init 上,但是对于核心数据,它对我来说似乎很复杂,无论我为 init 放什么东西, init 几乎总是有错误:/

标签: swift swiftui ios13 ios14


【解决方案1】:

我的原始评论误解了您的问题,请参见下文。 cmets中有很多信息。

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
                }
            }
    }
}

【讨论】:

  • 哇...我简直无语了。你是我的英雄……非常感谢 x999999 对代码和 cmets 的帮助……你的代码比以往任何时候都完美,我意识到我应该越来越多地学习和理解 Swift。再次感谢你!
  • Apple SwiftUI Tutorials 是一个不错的开始。实际输入所有步骤,因为它解释它,您将获得更深入的理解。
  • 感谢您的推荐!!我马上就做!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多