第二个选项卡警报上出现错误呈现视图控制器<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.