0

WatchConnectivity を追加したため、起動時にアプリがクラッシュします。削除するとバグも削除されるまで、アプリを簡素化しました。

現在、この最小限のアプリは、まったく関係のないものを削除するとバグが消えるという奇妙な状態になっています。たとえば、@AppStorageプロパティをに置き換える@Stateか、修飾子の別のバリエーションを選択するか、ビューの行.fullScreenCover()の修飾子を削除するか、ビューをビューのコンテンツに置き換えると、バグは消えます。.frame(maxWidth: .infinity, alignment: .leading)ForEachForEachForEach

問題はある種の競合状態であると思います。なぜこれが起こるのかがわかれば、バグが再びランダムに現れる方法がないことを確認できます.

再現するには、XCode で新しい iOS アプリを作成し、内部のすべてのコードを次のように置き換えますContentView

import SwiftUI
import WatchConnectivity

struct ContentView: View {

    @StateObject var connectivity = Connectivity()
    @AppStorage("setupKey") var hasBeenSetupBefore: Bool = false

    var body: some View {
        let sheetBinding = Binding<ActiveSheet?>(
            get: {
                if !hasBeenSetupBefore {
                    return ActiveSheet.setup
                } else {
                    return nil
                }
            },
            set: { _ in }
        )
        Text("Hello World")
            .fullScreenCover(
                item: sheetBinding,
                content: { _ in
                    WelcomeScreen()
                }
            )
    }

    enum ActiveSheet: Identifiable {
        case setup, settings

        var id: Int {
            hashValue
        }
    }
}

struct WelcomeScreen: View {

    var body: some View {
        NavigationView {
            VStack {
                ForEach(features) { feature in
                    Text("hello")
                        .frame(maxWidth: .infinity, alignment: .leading)
                }
            }
        }
    }

    let features = [
        Feature()
    ]
}

struct Feature: Identifiable {
    var id = UUID()
}

class Connectivity: NSObject, ObservableObject, WCSessionDelegate {

    @Published var activationState = WCSessionActivationState.notActivated

    override init() {
        super.init()

        if WCSession.isSupported() {
            let session = WCSession.default
            session.delegate = self
            session.activate()
        }
    }

    func session(
        _ session: WCSession,
        activationDidCompleteWith activationState: WCSessionActivationState,
        error: Error?
    ) {
        DispatchQueue.main.async {
            self.activationState = activationState
        }
    }

    func sessionDidBecomeInactive(_ session: WCSession) {}

    func sessionDidDeactivate(_ session: WCSession) {}

    func updateComplication(with data: [String: Any]) {}

    func session(_ session: WCSession, didReceiveUserInfo userInfo: [String: Any] = [:]) {}
}
4

0 に答える 0