gpt4 book ai didi

iOS14 引入 @State 绑定(bind)错误

转载 作者:行者123 更新时间:2023-12-01 16:11:13 27 4
gpt4 key购买 nike

下面的 swiftUI 代码在 iOS13 上运行良好,但是在使用 iOS14 进行测试时,我在尝试显示模式表时遇到了由强制解包选项引起的 fatal error 。据我所知,工作表不应该尝试为 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 的按钮就好像在分配工作表之前尝试显示工作表。

最佳答案

在 iOS 14 中看起来像 sheet(isPresented:content:)现在是预先创建的,所以对 selectedModel 所做的任何更改被忽略。
尝试使用 sheet(item:content:)反而:

var body: some View {
List {
...
}
.sheet(item: self.$selectedModel) {
SpeakerDetailView(speaker: $0)
}
}
并使用 @Environment(\.presentationMode) 关闭工作表:
struct SpeakerDetailView: View {
@Environment(\.presentationMode) private var presentationMode
var speaker: Speaker

var body: some View {
Text("Speaker view")
.onTapGesture {
presentationMode.wrappedValue.dismiss()
}
}
}

关于iOS14 引入 @State 绑定(bind)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63928736/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com