Ios SwiftUI:使用选择器更改ForEach源或获取请求(分段)

Ios SwiftUI:使用选择器更改ForEach源或获取请求(分段),ios,swift,foreach,swiftui,fetchrequest,Ios,Swift,Foreach,Swiftui,Fetchrequest,我对SwiftUI和一般的编码都是新手,如果之前有人提到过这一点,我很抱歉。我确实找过了,但找不清楚 我正在尝试制作一个用于存储笔记和任务的应用程序。(我不打算把它放在商店里,我对它太陌生了,但我确实想学习Swift,在实际的应用程序上工作对我来说比阅读它更有用。)我有一个名为“Base”的实体,有8个属性,并选择了自动Codegen类定义。我宁愿保持这种方式,请不要使用手册 我有三个取回请求。一个从核心数据中获取所有数据。另外两个过滤一个名为campoEstado的属性。目前在campoEst

我对SwiftUI和一般的编码都是新手,如果之前有人提到过这一点,我很抱歉。我确实找过了,但找不清楚

我正在尝试制作一个用于存储笔记和任务的应用程序。(我不打算把它放在商店里,我对它太陌生了,但我确实想学习Swift,在实际的应用程序上工作对我来说比阅读它更有用。)我有一个名为“Base”的实体,有8个属性,并选择了自动Codegen类定义。我宁愿保持这种方式,请不要使用手册

我有三个取回请求。一个从核心数据中获取所有数据。另外两个过滤一个名为campoEstado的属性。目前在campoEstado中,我只存储两个可能值中的一个,作为字符串:“Activas”和“Pospuestas”。将来我可能会添加更多,所以我不能使用布尔值

我得到一个处理一个获取请求的列表。但我无法在应用程序运行时更改该源。 我用.pickerStyle(SegmentedPickerStyle())创建了一个选择器,它显示了:Todo、Activas、Pospuestas。当用户在选择器中选择其中一个选项卡时,列表应更改为:

  • 表1:所有任务
  • 选项卡2:仅包含带有campoEstado=“Activas”(调用提取请求filtroActivas)的任务的筛选列表
  • 选项卡3:仅包含带有campoEstado=“Pospuestas”(调用获取请求filteropospuestas)的任务的筛选列表
它应该是什么样子:

ContentView中的我的代码:

    struct ContentView: View {    

@Environment(\.managedObjectContext) var moc    
    @FetchRequest(entity: Base.entity(), sortDescriptors: [
        NSSortDescriptor(keyPath: \Base.campoNota, ascending: true),
        NSSortDescriptor(keyPath: \Base.campoFechaCreacion, ascending: true)
    ], predicate: NSPredicate(format: "campoEstado == %@", "Activas")
    ) var filtroActivas: FetchedResults<Base>

    @FetchRequest(entity: Base.entity(), sortDescriptors: [
        NSSortDescriptor(keyPath: \Base.campoNota, ascending: true),
        NSSortDescriptor(keyPath: \Base.campoFechaCreacion, ascending: true)
    ], predicate: NSPredicate(format: "campoEstado == %@", "Pospuestas")
    ) var filtroPospuestas: FetchedResults<Base>

     @FetchRequest(entity: Base.entity(), sortDescriptors: [
        NSSortDescriptor(keyPath: \Base.campoNota, ascending: true),
        NSSortDescriptor(keyPath: \Base.campoFechaCreacion, ascending: true)
    ]
    ) var bases: FetchedResults<Base>

var body: some View {
        NavigationView {
            List {
                Picker("Solapas", selection: $selectorIndex) {
                    //This should connect to ForEach source, currently "bases"
                }
                .pickerStyle(SegmentedPickerStyle())
                
              
                ForEach(bases, id: \.self) { lista in
                    NavigationLink(destination: VistaEditar(base: lista)) {
                        Rectangle()
                        .foregroundColor(.gray)
                        .frame(width: 7, height: 50)
                        
                        VStack(alignment: .leading) {
                            Text(lista.campoNota ?? "Unknown title")
                                .font(.headline)
                            Text(lista.campoEstado ?? "Activas")
                        }
                    }
                }
struct ContentView:View{
@环境(\.managedObjectContext)变量moc
@FetchRequest(实体:Base.entity(),排序描述符:[
NSSortDescriptor(键路径:\Base.campoNota,升序:true),
NSSortDescriptor(键路径:\Base.campofechacion,升序:true)
],谓词:NSPredicate(格式:“campoEstado==%@”,“Activas”)
)变量filtroActivas:FetchedResults
@FetchRequest(实体:Base.entity(),排序描述符:[
NSSortDescriptor(键路径:\Base.campoNota,升序:true),
NSSortDescriptor(键路径:\Base.campofechacion,升序:true)
],谓词:NSPredicate(格式:“campoEstado==%@”,“Pospuestas”)
)var filteropospuestas:FetchedResults
@FetchRequest(实体:Base.entity(),排序描述符:[
NSSortDescriptor(键路径:\Base.campoNota,升序:true),
NSSortDescriptor(键路径:\Base.campofechacion,升序:true)
]
)var基:FetchedResults
var body:一些观点{
导航视图{
名单{
选择器(“Solapas”,选择:$selectorIndex){
//这应该连接到ForEach源,当前为“基”
}
.pickerStyle(SegmentedPickerStyle())
ForEach(base,id:\.self){lista in
导航链接(目的地:VistaEditar(基础:lista)){
矩形()
.foregroundColor(.灰色)
.框架(宽度:7,高度:50)
VStack(对齐:。前导){
文本(lista.campoNota??“未知标题”)
.font(.headline)
文本(lista.campoEstado??“活动”)
}
}
}
我有两个问题:

  • 我不知道如何将选择器中选定的选项卡与ForEach内部列表的源连接起来

  • 我让列表对一个获取请求起作用,这个请求会为我带来核心数据中的所有记录,但我不知道在应用程序运行时如何更改ForEach源。我尝试了一个变量数组,用于每个获取请求变量名称(基、filtroActivas和FiltroPopuestas),将它们放入[]但那没用

  • 我知道这并不优雅,我只是需要它先工作,然后追求效率和优雅。我肯定有一些愚蠢的事情我没有看到,但已经一个星期了,我感到绝望

    我希望我是清楚的,如果你需要更多的信息,请询问。
    如果有人能帮助我,我将非常感谢。提前谢谢!

    我担心我可能会被否决,因为这不是一个完整的答案。但我没时间了,我想看看我是否能让你走上正确的方向

    我相信您正在寻找的是一个数组数组。
    FetchedResult
    将返回一个可选数组,您需要确保它不是零。在我的示例中,我使用了
    compactMap
    来生成示例可选数组的非零数组,用于模拟从
    @FetchRequest返回的内容属性。您应该能够将此代码加载到Xcode中的新项目中以查看结果。同样,这不是一个完整的答案,但希望能够帮助您完成项目。我希望这有帮助,继续努力,您会得到它

    struct ContentView:View{
    //模拟来自CoreData的可选获取结果的示例数据。
    //这些是您的@FetchRequest属性
    让FetchedResultsBase:[字符串?]=[“红色”、“绿色”、“蓝色”]
    让fetchedResultsFiltroPospuestas:[字符串?]=[“1”、“2”、“3”]
    
    让fetchedResultsFiltroActivas:[字符串?]=[”☺️", "非常感谢,我会看看如何使用CoreData。我喜欢SwiftUI,所以我会耐心地学习它,否则我会在一周内感到沮丧。顺便说一句,我想说的是,我非常感谢你在回答问题时所做的努力。编码是很好地分离和注释的。再次感谢。所以我尝试了,我得到了答案一些错误。首先,我使用了NavigationView而不是VStack。在“.onAppear(perform:{self.loadFetchedResults()})”中,我得到了这个错误:“ContentView类型的值没有成员‘loadFetchedResults’”,然后,在函数func loadFetch中