首页 > 解决方案 > 尝试展开/折叠工作表上的部分时,SwiftUI 应用程序崩溃

问题描述

这个想法是,当用户单击标题时,它们会展开以显示控件。

当我展开其中一个部分时,它会崩溃,然后单击 TextField,然后单击不同的部分以使当前部分折叠并展开另一个部分。

注意事项:

  1. 这只是“工作表”的问题。如果我通过 NavigationLink 呈现 DetailView,它会完美运行
  2. 仅当我单击 TextField 时才会发生这种情况。如果我只是展开/折叠部分 - 一切正常
  3. Xcode 11.6,在 iOS 13.6 上运行

我的代码有什么问题?或者它是 SwiftUI 中的一个错误?

我将有问题的代码提炼成最小的工作示例

struct DetailView: View {
    @State var name: String = "Default name"
    
    @State var location: String = "Default location"
    
    @State var expanded : Int = -1
    
    var body: some View {
        VStack {
            Button (action: {self.expanded = 0}) {
                HStack {
                    Text(self.name).font(.caption)
                    Spacer()
                    Image (systemName: "chevron.right")
                }
            }
            if self.expanded == 0 {
                TextField ("Enter name", text: self.$name)
            }
            
            Button (action: {self.expanded = 1}) {
                HStack {
                    Text(self.location).font(.caption)
                    Spacer()
                    Image (systemName: "chevron.right")
                }
            }
            if self.expanded == 1 {
                TextField ("Enter location", text: self.$location)
            }
            Spacer()
        }.padding()
    }
 }


 struct ContentView: View {
    @State var showDetail = false
    
    var body: some View {
        NavigationView {
            
            Button ("Detail") {
                self.showDetail = true
            }.sheet(isPresented: self.$showDetail, content: {DetailView()})
            
        }
    }
}

标签: iosswiftiphoneswiftui

解决方案


万一有人从谷歌登陆这里,它最终会出现与此处相同的问题SwiftUI iOS 应用程序在状态更改导致键盘在工作表中辞去第一响应者时崩溃

然而,在我的情况下,堆栈是空的,只有在无数次尝试之后,我才得到一个ViewRendererHost.render除了通用“主”事件循环之外的堆栈。果然谷歌搜索它立即产生了上面的链接

将此报告给苹果。这显然是 SwiftUI 中的一个错误


推荐阅读