[英]SwiftUI - Intermittent crash when presenting sheet on a sheet
當我在已經在工作表中的視圖上顯示工作表時,我發生了不可預測的崩潰。 我已經能夠慢慢地剝離我的視圖和自定義類型的一部分,直到我得到下面仍然顯示崩潰的非常簡單和通用的視圖結構。
當我與 TextField 交互然后與顯示子表的按鈕之一交互時,就會發生崩潰。 有時需要在按鈕和文本字段之間點擊很多才能觸發崩潰,有時它會立即發生(如下面的 GIF 所示)。 有時我根本無法讓崩潰發生,但我的用戶不斷報告它。
在下面的 gif 圖中,崩潰發生在按下底部按鈕的那一刻。 您可以看到按鈕永遠不會從其“按下” state 中出來,並且工作表永遠不會出現。
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)
}
}
}
幾周前我遇到了類似的問題。 事實證明,當我在打開鍵盤的情況下展示新工作表時,它會導致崩潰。
我發現在顯示第二張表之前使用UIApplication.shared.endEditing()
可以解決問題
更新
對於 iOS 14 我創建了一個擴展,因為上面的 function 不再可用
extension UIApplication {
static func endEditing() {
let resign = #selector(UIResponder.resignFirstResponder)
UIApplication.shared.sendAction(resign, to: nil, from: nil, for: nil)
}
}
用法類似UIApplication.endEditing()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.