第二个选项卡上的 swiftui 错误警报显示视图控制器 <SwiftUI.PlatformAlertController: > 0x10580c400> 来自分离的视图控制器

问题描述 投票:0回答:1

这是“错误管理器”概念的错误用法吗?是不是 swiftUi 中的东西不再使用了?在第二个选项卡上,当我尝试显示错误时,在控制台上我得到这个:

从分离视图控制器呈现视图控制器 <TtGC7SwiftUI19UIHostingControllerVS_14_ViewList_View:0x10385ee00> 不支持,并且可能会导致不正确的安全区域插入和 损坏的根演示文稿。确保 <TtGC7SwiftUI19UIHostingControllerVS_14_ViewList_View:0x10385ee00> 在从视图控制器层次结构中呈现之前,它位于视图控制器层次结构中。将要 成为未来版本中的硬异常。

class ErrorManager: ObservableObject {
    static let shared = ErrorManager()
    @Published var currentError: TestError?
    
    private init() {}
    
    func handleError(_ error: TestError) {
        self.currentError = error
    }
}


enum TestError: Error, Identifiable, LocalizedError {
    
    var id: String {localizedDescription}
    
    case genericError
    
    var errorDescription: String? {
        switch self {
        case .genericError:
            return "Generic Error"
        }
    }
}


import SwiftUI

@main
struct errorManagerInTabViewControlelrAppApp: App {
    
    let classFromEntryPoint = ClassFromEntryPoint()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(ErrorManager.shared)
                .environmentObject(classFromEntryPoint)
        }
    }
}

//*****************************************************

class ClassFromEntryPoint: ObservableObject {
    
    @Published var alertError: TestError?
    
    init() {}
    
    func testThrowsError() throws {
        print("func called")
        throw TestError.genericError
    }
}

//*****************************************************

import SwiftUI

struct ContentView: View {
    
    @State private var selectedTab: Int = 0
    
    var body: some View {
        TabView(selection: $selectedTab) {
            FirstView(changeTab: self.changeTab)
                .tabItem { Label("First", systemImage: "star") }
                .tag(0)
            SecondView()
                .tabItem { Label("Second", systemImage: "star") }
                .tag(1)
        }
    }
    
    func changeTab(to index: Int) {
        selectedTab = index
    }
}


//*****************************************************


import SwiftUI

struct FirstView: View {
    
    @EnvironmentObject var classFromEntryPoint: ClassFromEntryPoint
    @EnvironmentObject var errorManager: ErrorManager
    
    var changeTab: (Int) -> Void
    
    
    var body: some View {
        VStack {
            Text("Hello first")
                .alert(item: $errorManager.currentError) { error in
                    Alert(title: Text("Error"), message: Text(error.localizedDescription), dismissButton: .default(Text("OK"), action: {
                        // do stuff
                    }))
                }
            
            Button("launch the error") {
                do {
                    try self.classFromEntryPoint.testThrowsError()
                } catch {
                    ErrorManager.shared.handleError(error as! TestError)
                    print("Error triggered:  \(error.localizedDescription)")
                }
            }
        }
    }
}

//*****************************************************

import SwiftUI

struct SecondView: View {
    
    @EnvironmentObject var classFromEntryPoint: ClassFromEntryPoint
    @EnvironmentObject var errorManager: ErrorManager

    var body: some View {
        VStack {
            Text("Hello second")
            Button("Test Print") {
                do {
                    try self.classFromEntryPoint.testThrowsError()
                } catch {
                    ErrorManager.shared.handleError(error as! TestError)
                    print("Error triggered:  \(error.localizedDescription)")
                }
            }
        }
    }
}
swiftui alert tabview
1个回答
0
投票

将警报放在

TabView
甚至
ContentView
上而不是
FirstView

© www.soinside.com 2019 - 2024. All rights reserved.