SwiftData中@Query带#Predicate时返回导航失效问题求助
问题原因与解决方案
核心原因
这是SwiftData在iOS 17早期版本中的已知bug:当@Query使用filter参数进行数据筛选时,会干扰NavigationStack的导航状态管理,导致返回按钮失效或无响应。
你的第二个子视图版本能正常工作,是因为它先通过无过滤的@Query获取全量数据,再在ForEach内部做条件筛选,这种方式没有触发上述bug,NavigationStack能正常跟踪视图的导航状态。
另外也需要确认你的VideoGame模型是否正确遵循Identifiable协议,且id属性是稳定唯一的(比如用@Attribute(.unique)修饰的UUID)——如果模型身份标识不稳定,也可能在带过滤的@Query场景下引发视图标识混乱,间接影响导航功能。
临时修复方案
- 暂时使用你第二个版本的写法(
ForEach内部筛选)规避bug; - 升级到最新的iOS 17正式版,苹果已修复这类SwiftData与
NavigationStack交互的问题; - 在子视图中显式注入
ModelContext,确保上下文与父视图一致:
struct FavoritListGameView: View { @Environment(\.modelContext) private var modelContext @Query( filter: #Predicate<VideoGame> {$0.favorite == true}, sort: [SortDescriptor(\VideoGame.name, order: .forward)] ) var favorites: [VideoGame] var body: some View { List{ Section("Favories") { ForEach(favorites){ fav in Text(fav.name) } } } } }
内容的提问来源于stack exchange,提问作者Dimitri Klopfstein
相关产品推荐
相关产品推荐

