【问题标题】:Core Data results into a SwiftUI Picker view without preselecting an optionCore Data 生成 SwiftUI Picker 视图,无需预选选项
【发布时间】:2021-12-12 04:46:49
【问题描述】:

我正在从 Core Data 中获取数据并将其显示在 Picker 中,这个视图是在 SwiftUI 中构建的。一开始我很难让选择器从选择器中工作,但发现如果我从获取结果中预先选择第一个对象,在视图的初始化中,选择器选择工作。

我想要的是能够将我的数据加载到选取器中,但不能预先选择其中一个对象。同样,如果我更新下面的代码以便没有预先选择任何内容,那么我将无法选择任何内容。我进入选项屏幕,但是当我点击一个时,什么也没有发生,我只是在行上看到那个小闪光。我必须点击返回按钮才能返回表单视图。

关于如何在不预先选择其中一个选项的情况下将核心数据加载到选取器中的任何想法?

-谢谢!

import SwiftUI
import CoreData

struct RecordCreateview: View {
    @FetchRequest private var actions: FetchedResults<Actions>
    @State private var selectedAction: Actions

    init(context: NSManagedObjectContext) {
        let fetchRequest: NSFetchRequest<Actions> = Actions.fetchRequest()
        fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \Actions.action, ascending: true)]
        fetchRequest.predicate = NSPredicate(value: true)
        self._actions = FetchRequest(fetchRequest: fetchRequest)
        do {
            let fetchResult = try context.fetch(fetchRequest)
            self._selectedAction = State(initialValue: fetchResult[0])
        } catch {
            fatalError("Problem fetching Action records.")
        }
    }
    
    var body: some View {
        NavigationView {
            Form {
                Picker("Select action", selection: $selectedAction){
                    ForEach(actions) { action in
                        if action.title == true {
                            Text("\(action.action!)").tag(action)
                        }
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • 我现在无法完整回答。我在我的手机上。但我最初的想法是在 actions 数组中添加一个额外的条目并将其用作初始选择。作为一种假动作。可能。或者您可以将 selectedAction 设为可选并将其设置为 nil 吗?
  • 是的,这是我想到的一个 hack。问题是用户将能够在这个数据存储中添加和删除记录,所以在这种情况下是不行的。不过谢谢!
  • 我认为,如果您只是将selectedAction 设置为init(...) 中不存在的Actions,例如:self._selectedAction = State(initialValue: Actions(context: context)),则选择器中不应有任何预选对象。
  • @workingdog,看起来很有效。您应该将其发布为答案,以便我可以标记为选定答案。谢谢!!
  • 这能回答你的问题吗? Choosing CoreData Entities from form picker

标签: ios core-data swiftui picker


【解决方案1】:

您可以将 selectedAction 设置为 init(...) 中不存在的 Actions,如下所示:

self._selectedAction = State(initialValue: Actions(context: context))

不会在选择器中设置预选对象。

struct RecordCreateview: View {
    @FetchRequest private var actions: FetchedResults<Actions>
    @State private var selectedAction: Actions

    init(context: NSManagedObjectContext) {
        let fetchRequest: NSFetchRequest<Actions> = Actions.fetchRequest()
        fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \Actions.action, ascending: true)]
        fetchRequest.predicate = NSPredicate(value: true)
        self._actions = FetchRequest(fetchRequest: fetchRequest)
        self._selectedAction = State(initialValue: Actions(context: context))  // <--- here
    }
    
    var body: some View {
        NavigationView {
            Form {
                Picker("Select action", selection: $selectedAction){
                    ForEach(actions) { action in
                        if action.title == true {
                            Text("\(action.action!)").tag(action)
                        }
                    }
                }
            }
        }
    }
}

【讨论】:

  • 这不是每次都创建一个新对象吗?
  • 是的,它每次都会创建一个新的Actions,但它不会保存它,除非你特别想保存它。您可以通过添加.onAppear{ print("---&gt; actions: \(actions.count)") } 来检查
猜你喜欢
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多