Swiftui 迅捷崩溃:“;前提条件失败:属性未能设置初始值:71”;

Swiftui 迅捷崩溃:“;前提条件失败:属性未能设置初始值:71”;,swiftui,Swiftui,我有一个非常有趣的车祸,只有在非常特殊的情况下才会发生。我已经向苹果公司提交了一份bug报告,但这里可能有人看到过类似的崩溃,知道发生了什么,知道解决方法 显示崩溃的最小项目可以在上找到,但我也在下面添加了相关代码。该项目有3个视图:RootView、DetailsView和ListViewRootView嵌入DetailsView或ListView 当按下DetailsView中的尾部导航栏按钮切换回ListView时,会发生崩溃。应用程序崩溃,错误为“前提条件失败:属性未能设置初始值:71”

我有一个非常有趣的车祸,只有在非常特殊的情况下才会发生。我已经向苹果公司提交了一份bug报告,但这里可能有人看到过类似的崩溃,知道发生了什么,知道解决方法

显示崩溃的最小项目可以在上找到,但我也在下面添加了相关代码。该项目有3个视图:
RootView
DetailsView
ListView
RootView
嵌入
DetailsView
ListView

当按下
DetailsView
中的尾部导航栏按钮切换回
ListView
时,会发生崩溃。应用程序崩溃,错误为“前提条件失败:属性未能设置初始值:71”

当您在屏幕中部使用<代码>按钮>代码>切换到<代码> ListVIEW>代码>时,不会发生崩溃。当从背景图像中删除<代码> .RsiZable()/Case>修饰符时,也不会发生崩溃。

此外,如果在
RootView
中将
Group
更改为
NavigationView
,则应用程序不会崩溃。遗憾的是,这不是我的真实应用程序的选项

导入快捷界面
最终类应用商店:ObserveObject{
@已发布的var showingDetails=true
}
结构RootView:View{
@EnvironmentObject私有变量存储:AppStore
var body:一些观点{
团体{
if store.showingDetails{
DetailsView()
}否则{
ListView()
}
}
}
}
结构细节视图:视图{
@EnvironmentObject私有变量存储:AppStore
var body:一些观点{
导航视图{
ZStack{
GeometryReader{geo-in
图像(“背景”)
.可调整大小()
.aspectRatio(内容模式:.fill)
.edgesIgnoringSafeArea(.all)
.框架(宽度:geo.size.width,高度:geo.size.height)
}
按钮(“列表”){

self.store.showingDetails=false/编辑:此解决方法会导致iPad的拆分导航视图出现问题。有关更好的解决方法,请参阅我的其他答案


一种解决方法是将
根视图
包装在
导航视图
中,并使用隐藏的导航栏(每个嵌套视图可能都有自己的导航栏,但不是所有视图都有):

struct RootView:View{
@EnvironmentObject私有变量存储:AppStore
var body:一些观点{
导航视图{
团体{
如果store.showingDetails!=无{
DetailsView(背景:store.showingDetails!)
}否则{
ListView()
}
}
.navigationBarHidden(真)
.navigationBarTitle(“”)
}
}
}

尽管如此,这次崩溃仍然非常奇怪。

这里是另一种解决方法(实际上它只是在避免出现这种问题的可能性),而且经过测试,没有不良副作用。仅供考虑

这样做的目的不是删除
详细视图
,而是使其显式处于非活动和隐藏状态。使用Xcode 11.2/iOS 13.2进行测试,没有崩溃

struct RootView: View {
  @EnvironmentObject private var store: AppStore

  var body: some View {
    ZStack {
        ListView()
            .zIndex(store.showingDetails ? 0 : 1)   // << bring to front
        DetailsView()
            .opacity(store.showingDetails ? 1 : 0)  // << hide
            .disabled(!store.showingDetails)        // << deactivate
    }
  }
}
struct RootView:View{
@EnvironmentObject私有变量存储:AppStore
var body:一些观点{
ZStack{
ListView()

.zIndex(store.showingDetails?0:1)/最后,解决方案是通过UIViewRepresentable使用自定义UIImageView

struct CustomImage:UIViewRepresentable{
var-image:UIImage
变量帧:CGRect
func makeUIView(上下文:context)->UIView{
让imageView=UIImageView(帧:帧)
imageView.contentMode=.ScaleSpectFill
imageView.clipsToBounds=true
imageView.TranslatesAutoResizezingMaskintoConstraints=false
imageView.image=image
let view=ui视图(帧:帧)
view.translatesAutoresizingMaskIntoConstraints=false
view.addSubview(imageView)
返回视图
}
func updateUIView(uiView:uiView,context:context){
}
}
然后使用如下方式:

GeometryReader{geo-in
CustomImage(图像:UIImage(名为:“bg”)!,帧:CGRect(x:0,y:0,宽度:geo.size.width,高度:geo.size.height))
}
.edgesIgnoringSafeArea(.all)

另请参见。

尝试用
@ViewBuilder
注释替换
RootView
中的组:

struct RootView: View {
  @EnvironmentObject private var store: AppStore

  @ViewBuilder
  var body: some View {
    if store.showingDetails {
      DetailsView()
    } else {
      ListView()
    }
  }
}

总的来说,我不确定这有多可靠。过去我在插入
@ViewBuilder
注释时成功率参差不齐,但这似乎解决了嵌套
导航视图的问题。遗憾的是,一旦我开始在iPad上测试应用程序,这种解决方法就不再是一个好办法。顶级导航视图真的很糟糕在iPad上使用你想要的分割视图导航样式。使用TabView可以解决崩溃问题,但由于你无法隐藏tabbar,这对我来说不是一个有效的解决方法。另一个有趣的事实是:如果你首先旋转iPad,这也可以防止崩溃发生。这太奇怪了。检查你是否想使用这个解决方法,尤其是在iPad上d、 通过UIViewRepresentable使用自定义UIImageView,我有一个很有前途的解决方法,因此绕过了可调整大小的图像:。它解决了崩溃问题,但我还不能让它全屏显示。感谢您的想法!但是这对我来说并不真正起作用,因为只有当有模型要显示时,才能显示DetailsView。如果没有模型,则不能当列表显示时。我必须使DetailsView下面的整个视图层次结构与可选模型一起工作,这会有点糟糕:)@KevinRenskers,没有模型存在问题,但这当然取决于你。至少我自己找到了解决方案。是的,我不想在qu中添加更多细节和复杂性估计。我最终解决了这个问题:昨天晚上我非常接近,今天早上终于解决了。请看下面我的答案。但再次感谢你的想法!根据我的调查,cr