iOS14 使用 @State 绑定引入错误 [英] iOS14 introducing errors with @State bindings

查看:23
本文介绍了iOS14 使用 @State 绑定引入错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面的 swiftUI 代码在 iOS13 上运行良好,但在使用 iOS14 进行测试时,我在尝试显示模式表时遇到了由强制展开的可选选项引起的致命错误.据我所知,工作表永远不应该尝试为 selectedModel 显示一个 nil 值,因为 ShowingDetails 只有在分配 selectedModel 后才会变为真?

The below swiftUI code was working fine with iOS13, but on testing with iOS14, I'm getting fatal errors caused by the force-unwrapped optional when trying to display the modal sheet. As far as I can tell, the sheet should never try to present with a nil value for selectedModel, as showingDetails is only ever made true after assigning 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 的按钮试图在它有时间分配之前显示它.

Interestingly, if I unwrap it as speaker: self.selectedModel ?? filteredSpeakers[0]it behaves exactly as expected: The first time pressing any of the menu items, the first item is passed to the sheet, but on dismissing the sheet and selecting another item it then shows the correct item every time. So it's as though the button to assign selectedModel is trying to display the sheet before it has had time assign it.

推荐答案

看起来在 iOS 14 中 sheet(isPresented:content:) 现在是预先创建的,因此对 selectedModel 被忽略.

It looks like in iOS 14 the sheet(isPresented:content:) is now created beforehand, so any changes made to selectedModel are ignored.

尝试使用 sheet(item:content:) 代替:

var body: some View {
    List {
        ...
    }
    .sheet(item: self.$selectedModel) {
        SpeakerDetailView(speaker: $0)
    }
}

并使用 @Environment(.presentationMode) 关闭工作表:

and dismiss the sheet using @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 绑定引入错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆