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

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

问题描述

下面的swiftUI代码在iOS13上运行正常,但是在iOS14上进行测试时,由于尝试显示模式表时强制展开的可选内容而导致致命错误.据我所知,工作表绝不应该尝试为selectedModel呈现nil值,因为showingDetails仅在分配selectedModel后才变为true?

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)关闭工作表:

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天全站免登陆