使用选项卡视图时导致'AttributeGraph precondition failure'的原因是什么?



我有一个单独的视图应用程序包装在NavigationView中,我在其中填充从API获取的数据。然而,我需要添加一个带有TabView的配置文件部分,有时当我运行应用程序时,就在显示启动屏幕时,我会出现以下错误(大约每三次运行/调试应用程序一次(,应用程序就会崩溃。

AttributeGraph前提条件失败:属性的值类型无效:56028(应为PlatformItemList,见BridgedTableViewState(

导致错误的视图:

TabView {

NavigationView {
MainView()
}
.tabItem { VStack {
Image(systemName: "list.dash")
Text("main")
}
}

NavigationView {
ProfileView()
}
.tabItem { VStack {
Image(systemName: "person.crop.circle")
Text("profile")
}
}
}

我删除了TabView和配置文件视图,应用程序始终运行,没有任何异常,这就是为什么我认为这是TabView的问题。我搜索了AttributeGraph、PlatformItemList和BridgedTableViewState的文档,但没有找到。

我遇到了一个相关错误:AttributeGraph前提条件失败:属性的值类型无效:431640(请参阅PreferenceKeys,应为ViewList(。

此错误不会出现在功能和数据库代码几乎相同但使用UIKit和手动构建的选项卡视图、列表视图等的应用程序中。仅在具有SwiftUI结构的SwiftUI版本中适用于这些视图。

删除Persistence类和持久性管理似乎解决了这个问题(我使用直接的SQLite代码来实现持久性,而不是CoreData(。

Xcode错误消息可能更有帮助。

我也遇到过同样的问题。它是由WKWebView的AnyView和NSViewRepresentable包装器的组合引起的。通过用@ViewBuilder重写helper函数来摆脱AnyView解决了这个问题。

问题:

func viewFunc() -> AnyView {
switch self {
case .case1: return AnyView(ListOfWebViewWrappers())
default:     return AnyView(WaitView())
}
}

解决方案:

@ViewBuilder
func viewFunc() -> some View {
switch self {
case .case1: ListOfWebViewWrappers()
default:     WaitView()
}
}

@ViewBuilder允许SwiftUI正确跟踪每个视图的标识并正确管理资源。有关视图标识的详细信息:https://developer.apple.com/videos/play/wwdc2021/10022/

我花了很多时间处理一个具有多个选项卡视图的应用程序中的前置条件故障崩溃。您的一个或多个特定视图(ProfileView或MainView(是否也在使用NavigationView?如果是这样,那可能就是问题所在。Xcode很乐意让您在每个新视图中添加NavigationViews,但这实际上并不是SwiftUI的工作方式。由于每个TabView都包含在NavView中,因此您不应该在这些视图中使用NavView。

(此外,可能只是装饰性的,但在上面的代码片段中,在您的第二个Nav视图之前似乎有一个额外的紧密大括号。(

相关内容

  • 没有找到相关文章

最新更新