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