【发布时间】:2020-02-02 17:54:51
【问题描述】:
我有一个非常有趣的崩溃,它只发生在非常特定的情况下。我已经向 Apple 提交了错误报告,但也许这里有人看到过类似的崩溃,知道发生了什么,并且知道解决方法?
可以在https://github.com/kevinrenskers/SwiftUICrash 找到显示崩溃的最小项目,但我还在下面添加了相关代码。该项目有 3 个视图:RootView、DetailsView 和 ListView。 RootView 嵌入 DetailsView 或 ListView。
当您按下DetailsView 中的尾随导航栏按钮切换回ListView 时,会发生崩溃。应用程序崩溃并出现错误“前提条件失败:属性未能设置初始值:71”。
但是,当您使用屏幕中间的Button 切换回ListView 时,不会发生崩溃。当您从背景图像中删除 .resizable() 修饰符时,也不会发生崩溃。
此外,如果您将Group 更改为NavigationView 内的RootView,应用程序不会崩溃。遗憾的是,这对于我的实际应用程序来说不是一个选项。
import SwiftUI
final class AppStore: ObservableObject {
@Published var showingDetails = true
}
struct RootView: View {
@EnvironmentObject private var store: AppStore
var body: some View {
Group {
if store.showingDetails {
DetailsView()
} else {
ListView()
}
}
}
}
struct DetailsView: View {
@EnvironmentObject private var store: AppStore
var body: some View {
NavigationView {
ZStack {
GeometryReader { geo in
Image("bg")
.resizable()
.aspectRatio(contentMode: .fill)
.edgesIgnoringSafeArea(.all)
.frame(width: geo.size.width, height: geo.size.height)
}
Button("List") {
self.store.showingDetails = false // <- this works fine
}
.padding(20)
.background(Color.white)
}
.navigationBarTitle(Text("Details"))
.navigationBarItems(trailing: trailingNavigationBarItem)
}
}
private var trailingNavigationBarItem: some View {
Button("List") {
self.store.showingDetails = false // <- this crashes the app!
}
}
}
struct ListView: View {
@EnvironmentObject private var store: AppStore
var body: some View {
NavigationView {
Button("Load details") {
self.store.showingDetails = true
}
.padding(20)
.background(Color.white)
.navigationBarTitle("List")
}
}
}
【问题讨论】:
-
我有一个很有前途的解决方法,通过 UIViewRepresentable 使用自定义 UIImageView,从而绕过可调整大小的图像:github.com/kevinrenskers/SwiftUICrash/tree/workarounds/…。它解决了崩溃,但我还不能让它全屏显示。
标签: swiftui