条件渲染不起作用 SwiftUI

问题描述

我有以下几点:

import SwiftUI

struct Search: View {
    @StateObject var genericObservable = GenericObservable(type: Type.card)
    
    var body: some View {
        switch genericObservable.cards {
        case .success(let cards):

>             Text("Success")

        case .failure(_):
            ProgressView().frame(maxWidth: .infinity,maxHeight: .infinity)
        }
    }
}

以上代码呈现 this

但是,当我将此 Text("Success") 置于条件中(因为它应该工作)时,应用程序变为空白。

import SwiftUI

struct Search: View {
    @StateObject var genericObservable = GenericObservable(type: Type.card)
    
    var body: some View {
        switch genericObservable.cards {
        case .success(let cards):
          if (cards.isEmpty) {
              Text("Loading")
          } else {
              Text("Success")
          }
        case .failure(_):
            ProgressView().frame(maxWidth: .infinity,maxHeight: .infinity)
        }
    }
}

这不会渲染任何东西 -> look here

这里的参考是 GenericObservable()

import Foundation

enum Type: String {
    case card = "CARD"
    case none = "NONE"
}

class GenericObservable: ObservableObject {
    
    static let shared = GenericObservable(type: Type.none)
    @Published var cards: Result<[Card],Error> = .success([])
    
    func fetchAllCardsQuery(completion: @escaping(Result<[Card],Error>) -> Void) {
        request(route: .fetchAllCategories,method: .get,completion: completion)
    }
    
    init(type: Type) {
        if (type == Type.card) {
            fetchAllCardsQuery {(result) in
                switch result {
                case .success(let allCards):
                    self.cards = .success(allCards)
                    
                case .failure(let error):
                    self.cards = .failure(error)
                }
            }
        }
    }
    
    private func request<T: Decodable>(route: Route,method: Method,parameters: [String: Any]? = nil,completion: @escaping(Result<T,Error>) -> Void) {
        guard let request = createRequest(route: route,method: method,parameters: parameters) else {
            completion(.failure(AppError.unkNownError))
            return
        }
        
        URLSession.shared.dataTask(with: request) { data,response,error in
            var result: Result<Data,Error>?
            if let data = data {
                result = .success(data)
                // let responseString = String(data: data,encoding: .utf8) ?? "Could not stringify our data"
                // print("The response is:\n\(responseString)")
            } else if let error = error {
                result = .failure(error)
                // print("The error is: \(error.localizedDescription)")
            }
            
            dispatchQueue.main.async {
                self.handleResponse(result: result,completion: completion)
            }
        }.resume()
    }
    
    private func handleResponse<T: Decodable>(result: Result<Data,Error>?,completion:@escaping  (Result<T,Error>) -> Void) {
        guard let result = result else {
            completion(.failure(AppError.unkNownError))
            return
        }
        
        switch result {
        case .success(let data):
            let decoder = JSONDecoder()
            guard let response = try? decoder.decode(T.self,from: data) else {
                completion(.failure(AppError.errorDecoding))
                return
            }
            completion(.success(response))
            
        case .failure(let error):
            completion(.failure(AppError.serverError(error.localizedDescription)))
        }
    }
    

    private func createRequest(route: Route,parameters: [String: Any]? = nil) -> URLRequest? {
        let urlString = Route.baseUrl + route.description
        guard let url = URL(string: urlString) else { return nil }
        var urlRequest = URLRequest(url: url)
        urlRequest.addValue("application/json",forHTTPHeaderField: "Content-Type")
        urlRequest.httpMethod = method.rawValue
        
        if let params = parameters {
            switch method {
            case .get:
                var urlComponent = URLComponents(string: urlString)
                urlComponent?.queryItems = params.map { URLQueryItem(name: $0,value: "\($1)") }
                urlRequest.url = urlComponent?.url
            case .post,.delete,.patch:
                let bodyData = try? JSONSerialization.data(withJSONObject: params,options: [])
                urlRequest.httpBody = bodyData
            }
        }
        return urlRequest
    }
}

这是ContentView()

struct CoreView: View {
    @State private var selection = 1
    
    @Environment(\.managedobjectContext) private var viewContext
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp,ascending: true)],animation: .default)
    
    private var items: FetchedResults<Item>
    
    var body: some View {
        vstack {
            TabView(selection: $selection) {
                Text("Bookmark").tag(0)
                
                Search().tag(1)
                
                Text("Add").tag(2)
                
                Text("Comment").tag(3)
                
                Text("Account").tag(4)
            }.tabViewStyle(PageTabViewStyle(indexdisplayMode: .never))
            
            Divider()
            
            CustomTabBarUIView(selection: $selection)
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)