【发布时间】:2021-01-03 19:09:21
【问题描述】:
下面的 swiftUI 代码在 iOS13 上运行良好,但在使用 iOS14 进行测试时,我在尝试显示模式表时遇到了由强制解包选项引起的致命错误。据我所知,工作表不应该尝试显示 selectedModel 的 nil 值,因为仅在分配 selectedModel 后才显示详细信息?
struct SpeakerBrandMenu: View {
var filteredSpeakers: [Speaker] {
// An array of Speaker objects
}
@State var selectedModel: Speaker?
@State private var showingDetails = false
var body: some View {
List{
ForEach(filteredSpeakers) { speaker in
HStack {
Button(action: {
self.selectedModel = speaker
self.showingDetails = true
}) {
SpeakerModelRow(speaker: speaker).contentShape(Rectangle())
}
.buttonStyle(PlainButtonStyle())
Spacer()
Button(
//unrelated
).padding(5)
}
}
} .sheet(isPresented: self.$showingDetails) { SpeakerDetailView(speaker: self.selectedModel!, showSheet: self.$showingDetails).environmentObject(self.favoriteSpeakers).environmentObject(self.settings)}
.navigationBarTitle(Text(brand), displayMode: .inline)
}
}
有趣的是,如果我将其解开为speaker: self.selectedModel ?? filteredSpeakers[0]它的行为与预期完全一样:第一次按下任何菜单项时,第一项被传递给工作表,但在关闭工作表并选择另一个项目时它会显示每次都是正确的项目。因此,分配 selectedModel 的按钮就好像在分配工作表之前尝试显示工作表一样。
【问题讨论】:
-
视图创建顺序是未定义的,所以你永远不应该依赖它。最适合您的方案的解决方案是通过
.sheet(item...修饰符,如下面的@pawello2222 答案。 -
我刚刚在切换到 iOS 14 时遇到了这个问题 - Apple 的错误非常严重。