Core data 例如,在HStack中,如何在SwiftUI中与我的选取器选择相同的线上包含一个圆?

Core data 例如,在HStack中,如何在SwiftUI中与我的选取器选择相同的线上包含一个圆?,core-data,swiftui,picker,Core Data,Swiftui,Picker,当模拟我的应用程序时,我有一个选择器的代码(在表单中,因此我可以获得选择的导航视图): Picker(“培训组”,选择:$numberOfPeople){ ForEach(2..

当模拟我的应用程序时,我有一个选择器的代码(在
表单中
,因此我可以获得选择的导航视图):

Picker(“培训组”,选择:$numberOfPeople){
ForEach(2..<10){
HStack{
圆圈().填充(颜色.系统黄色)
.框架(宽度:16,高度:16)
文本(“组\(编号)”)
}
}
这是可行的:在picker和随后的nav视图中都有漂亮的小圆圈,就像在苹果自己的日历应用程序中一样——在为活动选择日历时,每个选择都用自己的颜色“标签”/“标签”标注

现在我正试图用一个使用核心数据的应用程序来实现这一点,但代码不再有效。选择器只接受文本视图,其他任何操作都会导致绑定不起作用,并且在我的示例中,所选的“级别”不会保存到managedObjectContext

这是我的CoreData尝试中的结构:

struct AthleteProfile: View {

    @Environment(\.managedObjectContext) private var viewContext
    
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Level.name, ascending: true)],
        animation: .default)

    private var levels: FetchedResults<Level>
    
    @ObservedObject var athlete: Athlete

    var body: some View {
        Form {
            Text(athlete.lastName ?? "Unknown")
            Picker("Level", selection: $athlete.level) {
                ForEach(levels) { (level: Level?) in

                        /// I want to place this Text view into an HStack like this:

                    HStack {
                        Circle().fill(Color.green)
                            .frame(width: 16, height: 16)
                        Text("\(level?.name ?? "Unassigned")").tag(level)
                    }

                        /// but the above fails. This below works:

                    Text("\(level?.name ?? "Unassigned")").tag(level)

                       /// of course, I use only one of them in the app, the other commented out.

                }
            }
        }
        .onDisappear(perform: {
            saveContext()
        })
    }
    
    private func saveContext() {
        do {
            try viewContext.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            let nsError = error as NSError
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
        }
    }
}

struct-AthleteProfile:视图{
@环境(\.managedObjectContext)私有变量viewContext
@获取请求(
SortDescriptor:[NSSortDescriptor(键路径:\Level.name,升序:true)],
动画:。默认设置)
私有变量级别:FetchedResults
@观察对象变量运动员:运动员
var body:一些观点{
形式{
文本(atternate.lastName??“未知”)
选择器(“级别”,选择:$atternate.Level){
ForEach(levels){(level:level?)
///我想将此文本视图放置到HStack中,如下所示:
HStack{
圆圈().填充(颜色.绿色)
.框架(宽度:16,高度:16)
文本(“\(级别?.name??“未分配”)”).tag(级别)
}
///但上述方法无法奏效。以下方法有效:
文本(“\(级别?.name??“未分配”)”).tag(级别)
///当然,我在应用程序中只使用了其中一个,另一个被注释掉了。
}
}
}
.onDisappear(执行:{
saveContext()
})
}
private func saveContext(){
做{
请尝试viewContext.save()
}抓住{
//将此实现替换为适当处理错误的代码。
//fatalError()导致应用程序生成崩溃日志并终止。您不应在装运应用程序中使用此函数,尽管它在开发过程中可能很有用。
设nsError=错误为nsError
fatalError(“未解决的错误\(nsError),\(nsError.userInfo)”)
}
}
}

可能有什么问题?

这可能是因为您试图将
.tag(level)
应用于内部视图:

HStack {
    Circle().fill(Color.green)
        .frame(width: 16, height: 16)
    Text("\(level?.name ?? "Unassigned")").tag(level)
}
下面的示例之所以有效,是因为
tag
应用于
ForEach
中的顶层视图:

Text("\(level?.name ?? "Unassigned")").tag(level)
解决方案可能是将
标签
附加到
HStack

HStack {
    Circle().fill(Color.green)
        .frame(width: 16, height: 16)
    Text("\(level?.name ?? "Unassigned")")
}
.tag(level)
HStack {
    Circle().fill(Color.green)
        .frame(width: 16, height: 16)
    Text("\(level?.name ?? "Unassigned")")
}
.tag(level)