Ios SwiftUI:使用选择器更改ForEach源或获取请求(分段)
我对SwiftUI和一般的编码都是新手,如果之前有人提到过这一点,我很抱歉。我确实找过了,但找不清楚 我正在尝试制作一个用于存储笔记和任务的应用程序。(我不打算把它放在商店里,我对它太陌生了,但我确实想学习Swift,在实际的应用程序上工作对我来说比阅读它更有用。)我有一个名为“Base”的实体,有8个属性,并选择了自动Codegen类定义。我宁愿保持这种方式,请不要使用手册 我有三个取回请求。一个从核心数据中获取所有数据。另外两个过滤一个名为campoEstado的属性。目前在campoEstado中,我只存储两个可能值中的一个,作为字符串:“Activas”和“Pospuestas”。将来我可能会添加更多,所以我不能使用布尔值 我得到一个处理一个获取请求的列表。但我无法在应用程序运行时更改该源。 我用.pickerStyle(SegmentedPickerStyle())创建了一个选择器,它显示了:Todo、Activas、Pospuestas。当用户在选择器中选择其中一个选项卡时,列表应更改为:Ios SwiftUI:使用选择器更改ForEach源或获取请求(分段),ios,swift,foreach,swiftui,fetchrequest,Ios,Swift,Foreach,Swiftui,Fetchrequest,我对SwiftUI和一般的编码都是新手,如果之前有人提到过这一点,我很抱歉。我确实找过了,但找不清楚 我正在尝试制作一个用于存储笔记和任务的应用程序。(我不打算把它放在商店里,我对它太陌生了,但我确实想学习Swift,在实际的应用程序上工作对我来说比阅读它更有用。)我有一个名为“Base”的实体,有8个属性,并选择了自动Codegen类定义。我宁愿保持这种方式,请不要使用手册 我有三个取回请求。一个从核心数据中获取所有数据。另外两个过滤一个名为campoEstado的属性。目前在campoEst
- 表1:所有任务
- 选项卡2:仅包含带有campoEstado=“Activas”(调用提取请求filtroActivas)的任务的筛选列表
- 选项卡3:仅包含带有campoEstado=“Pospuestas”(调用获取请求filteropospuestas)的任务的筛选列表
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??“活动”)
}
}
}
我有两个问题:
如果有人能帮助我,我将非常感谢。提前谢谢!我担心我可能会被否决,因为这不是一个完整的答案。但我没时间了,我想看看我是否能让你走上正确的方向 我相信您正在寻找的是一个数组数组。
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中