简体   繁体   English

在 swiftUI 的不同视图中显示自定义错误屏幕

[英]Display customised error screen in a different view in swiftUI

I am trying to show a error message in a different view as in the below code我试图在不同的视图中显示错误消息,如下面的代码所示

import Foundation

class apiCall: ObservableObject {
    func getUsers(completion:@escaping ([ResultItem]) -> ()) {
        
        let urlHeader=apiParams()
        URLSession.shared.dataTask(with: urlHeader) { (data, response , error) in
            let httpResponse = response as? HTTPURLResponse
            guard let data = data else { return }
           // print(String(data: data, encoding: .utf8) ?? "Invalid JSON")
            
                   do {
                       let result = try JSONDecoder().decode(Result.self,from: data)
                        completion(result.customerList)
                   } catch {
                   
                   completion([])
                   errorview()
                    print("error:", error.localizedDescription)
                   }
               }.resume()
        

        }
}

errorView() is a view file which i want to display when the code enters inside catch block, but currently I am getting blank screen and the details inside errorView is not getting displayed errorView() 是一个视图文件,当代码进入 catch 块内时我想显示它,但目前我得到空白屏幕并且 errorView 内的详细信息没有显示

//errorview page

import SwiftUI

struct errorview: View {
    var body: some View {
        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
    }
}

struct errorview_Previews: PreviewProvider {
    static var previews: some View {
        errorview()
    }
}

I will modify the error message in this page once I am able to see this content from catch block一旦我能够从 catch 块中看到此内容,我将修改此页面中的错误消息

try this approach as shown in this very basic example code, to "go" to the Errorview when your ApiCall , produces an error:尝试这种方法,如这个非常基本的示例代码所示,当您的Errorview产生错误时“转到”错误ApiCall

Adjust according to your needs:根据您的需要进行调整:

struct ResultItem: Identifiable {
    let id = UUID()
    var name: String
    // ...
}

struct Errorview: View {
    @State var theError: APICallError?
    var body: some View {
        Text("Errorview: \(theError.debugDescription)")
    }
}

enum APICallError: Error {
    case decodingError
    case outOfLuck
    // ...
}

class ApiCall: ObservableObject {
    
    func getUsers(completion:@escaping ([ResultItem], APICallError?) -> ()) {
        let urlHeader = apiParams()  // <-- a URL or URLRequest here
        URLSession.shared.dataTask(with: urlHeader) { (data, response , error) in
            guard let data = data else {
                 completion([], APICallError.outOfLuck)
                 return
            }
            do {
                let result = try JSONDecoder().decode(Result.self,from: data)
                completion(result.customerList, nil)
            } catch {
                completion([], APICallError.decodingError)
            }.resume()
        }
    }
    
}

struct ContentView: View {
    @State var theError: APICallError?
    @State var actions: [Int] = []
    
    var body: some View {
        NavigationStack(path: $actions) {
            Text("ContentView")
                .navigationDestination(for: Int.self) { val in
                    Errorview(theError: theError)
                }
        }
        .onAppear {
            ApiCall().getUsers() { results, error in
                if error != nil {
                    theError = error
                    actions = [1]
                } else {
                    print("-----> results: \(results)")
                    // ....
                }
            }
        }
    }
}

EDIT-1: using NavigationView EDIT-1:使用NavigationView

struct ContentView: View {
    @State var theError: APICallError?
    @State var isSelected = false  // <-- here
    
    var body: some View {
        NavigationView {
            VStack {
                Text("ContentView")
                NavigationLink("", destination: Errorview(theError: theError), isActive: $isSelected)
            }
        }
            .onAppear {
                ApiCall().getUsers() { results, error in
                    if error != nil {
                        theError = error
                        isSelected = true  // <-- here
                    } else {
                        print("-----> results: \(results)")
                        // ....
                    }
                }
            }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM