有没有办法在 FetchRequest 和 SectionedFetchRequest 之间动态切换?

Posted

技术标签:

【中文标题】有没有办法在 FetchRequest 和 SectionedFetchRequest 之间动态切换?【英文标题】:Is there a way to dynamically switch between FetchRequest and SectionedFetchRequest? 【发布时间】:2021-11-02 19:05:11 【问题描述】:

在过去的几天里,我一直在玩 CoreData,试图构建一个应用程序来审查在购物上花费的钱。现在它仍然非常简单,只有一个数据模型用于各个商店。 我有一个显示所有这些的列表视图,并且我已经将排序集成到列表中,首先是通过围绕谓词的较旧的解决方法,但是我发现了今年 wwdc 的 this 视频,我基本上只是复制了。我对 SectionedFetchRequest 的分组功能非常着迷,我想整合它,同时保持原始的非分段列表。所以我想我会跳过 List 中的 FetchRequest 并将结果传递给列表视图而不是 SortDescriptor

MainView
    ListView(descriptor: SortDescriptor)

ListView
    FetchRequest(sortDescriptors: descriptor)

改为:

MainView
    ListView(FetchRequest(sortDescriptors: descriptor))

ListView
    FetchedResults

但这仍然让我无法按一个按钮来打开或关闭切片。 我有点不知道如何从这里继续。我想到的第一个想法是围绕 ListView 处理创建一个包装器,FetchRequest 根据按钮切换状态将其发送到 ListView

MainView
    Wrapper(sortDescriptors, toggleState)

Wrapper
    ListView(FetchRequest(sortDescriptors: descriptor))

ListView
    FetchedResults

但我仍然会遇到问题,即我的 ListView 中需要 2 个变量,一个用于普通变量,一个用于 sectionedFetchResults。 有谁知道如何处理这个问题?

TLDR 我想在 FetchRequest 和 SectionedFetchRequest 之间动态切换

【问题讨论】:

【参考方案1】:

根据documentation,您不能不分割SectionedFetchRequest,因此您必须同时支持两者。因此,我会制作两个单独的子视图,并在父视图中显示它们,该父视图具有控制显示哪一个的逻辑。如果您支持 ios 15 之前的操作系统,则无论如何都需要这样做。

MainView
    if sectioned
        ListViewSectioned(sortDescriptors: descriptor, sectionID: sectionID)
     else 
        ListView(sortDescriptors: descriptor)
    


ListView
    FetchRequest(sortDescriptors: descriptor)


ListViewSectioned
    SectionedFetchRequest(sectionIdentifier: sectionID, sortDescriptors: descriptor)

主视图不必再知道选择和设置不同的列表视图。我没有签入操作系统,但你也需要它。

【讨论】:

很简单,谢谢你解开这个结

以上是关于有没有办法在 FetchRequest 和 SectionedFetchRequest 之间动态切换?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CloudKit + CoreData,如何在没有 SwiftUI 的 @FetchRequest 的情况下从远程云更新中更新 UI?

SwiftUI Preview 不适用于 FetchRequest 和 Init

带有 NSPredicate 的 Fetchrequest 不返回正确的值

SwiftUI - 如何在 init 中使用 fetchRequest 更新数据

Swift 核心数据 FetchRequest NSData 到 UIIMage

Coredata fetchrequest 谓词没有显示正确的东西