【问题标题】:SwiftUI - Intermittent crash when presenting sheet on a sheetSwiftUI - 在工作表上显示工作表时间歇性崩溃
【发布时间】:2020-05-04 18:36:39
【问题描述】:

当我在工作表中已经存在的视图上显示工作表时,意外发生了崩溃。我已经能够慢慢剥离部分视图和自定义类型,直到我得到下面仍然显示崩溃的非常简单和通用的视图结构。

当我与 TextField 交互然后与显示子表的按钮之一交互时发生崩溃。有时需要在按钮和文本字段之间点击很多才能触发崩溃,有时它会立即发生(如下面的 GIF 所示)。有时我根本无法让崩溃发生,但我的用户不断报告它。

在下面的 gif 中,崩溃发生在按下底部按钮的那一刻。您可以看到按钮永远不会退出其“按下”状态,并且工作表永远不会出现。

Xcode 没有提供任何有关崩溃的有用信息(截图如下)。

我只在运行 13.4.1 和 Xcode 11.4.1 的 iPhone XR 上实现了它。我在 iPhone 6s 和几个模拟器上尝试过,都无法触发崩溃,但用户已经在多个设备上报告了它。

struct ContentView: View {

    @State var showingSheetOne: Bool = false

    var body: some View {
        Button(action: { self.showingSheetOne = true }) {
            Text("Show")
        }
        .sheet(isPresented: $showingSheetOne) {
            SheetOne(showingSheetOne: self.$showingSheetOne)
        }
    }
}

struct SheetOne: View {

    @Binding var showingSheetOne: Bool
    @State var text = ""

    var body: some View {
        VStack {
            SheetTwoButton()
            SheetTwoButton()
            SheetTwoButton()
            TextField("Text", text: self.$text)
        }
    }

}

struct SheetTwo: View {

    @Binding var showing: Bool

    var body: some View {
        Button(action: {
            self.showing = false
        }) {
            Text("Hide")
                .frame(width: 300, height: 100)
                .foregroundColor(.white)
                .background(Color.blue)
        }
    }

}

struct SheetTwoButton: View  {

    @State private var showSheetTwo: Bool = false

    var body: some View {
        Button(action: { self.showSheetTwo = true } ) {
            Image(systemName: "plus.circle.fill")
                .font(.headline)
        }.sheet(isPresented: self.$showSheetTwo) {
            SheetTwo(showing: self.$showSheetTwo)
        }
    }

}

【问题讨论】:

  • 有趣。你试过清理你的项目吗? CMD+SHIFT+K 和 CMD+ALT+SHIFT+K?
  • 是的,只是再次清洁它以确保它发生两次。一次就像 GIF 一样,第二次是在按了几次按钮并关闭出现的第二张纸之后。
  • 我实际上是从我的原始项目中获取了这些视图,并且现在正在一个全新的项目中对其进行测试,以便我可以隔离问题。
  • 好吧,我想这就是适合你的 SwiftUI。我试过你的代码,模拟器上什么也没发生。奇怪的一个。尝试放置异常断点。
  • 我能够得到异常的描述,但当然 SwiftUI 的实际实现是如此模糊,我不知道这意味着什么:“错误:无法实现:无法读取寄存器 x0 的值错误:在 DoExecute 中出错,无法 PrepareToExecuteJITExpression"

标签: ios swift swiftui


【解决方案1】:

几周前我遇到了类似的问题。事实证明,当我在打开键盘的情况下展示新工作表时,它会导致崩溃。

我发现在显示第二张表之前使用UIApplication.shared.endEditing() 可以解决问题

更新

对于 iOS 14,我创建了一个扩展,因为上述功能不再可用

extension UIApplication {
    
    static func endEditing() {
        let resign = #selector(UIResponder.resignFirstResponder)
        UIApplication.shared.sendAction(resign, to: nil, from: nil, for: nil)
    }
    
}

用法类似UIApplication.endEditing()

【讨论】:

  • 哦,哇!它认为就是这样。这就是为什么没有文本字段我永远无法实现它的原因。我将在我的实际应用程序上对其进行测试。在切换表单装订之前关闭键盘很容易。
  • :P 奇怪的 swiftUI 错误。有类似的问题,但在我的.sheet() 中有textField.becomeFirstResponder()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多