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)