簡體   English   中英

SwiftUI - 在工作表上顯示工作表時間歇性崩潰

[英]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)
        }
    }

}

崩潰屏幕錄制 Xcode 崩潰 01 Xcode 崩潰 02 Xcode 崩潰 03 Xcode 崩潰 04

幾周前我遇到了類似的問題。 事實證明,當我在打開鍵盤的情況下展示新工作表時,它會導致崩潰。

我發現在顯示第二張表之前使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM