簡體   English   中英

如何將圖像更改為結構? 用戶界面

[英]How to change an image to a structure? SwiftUI

現在,當應用程序打開時,會顯示鏈接中的圖像,但如果用戶沒有互聯網,則會顯示我的應用程序文件中的圖像

如果用戶沒有互聯網連接,如何代替我的圖像 - 名稱:“noconnection”,顯示我的結構:Indicator()。

我的代碼:

struct RemoteImage: View {

    private enum LoadState {
        case loading, success, failure
    }

    private class Loader: ObservableObject {
            var data = Data()
            var state = LoadState.loading

            init(url: String) {
                guard let parsedURL = URL(string: url) else {
                    fatalError("Invalid URL: \(url)")
                }

                URLSession.shared.dataTask(with: parsedURL) { data, response, error in
                    if let data = data, data.count > 0 {
                        self.data = data
                        self.state = .success
                    } else {
                        self.state = .failure
                    }

                    DispatchQueue.main.async {
                                        self.objectWillChange.send()
                                    }
                                }.resume()
                            }
                        }

    @StateObject private var loader: Loader
     var loading: Image
     var failure: Image

     var body: some View {
         selectImage()
             .resizable()
     }

    init(url: String, loading: Image = Image("loadingimage"), failure: Image = Image("noconnection")) {
         _loader = StateObject(wrappedValue: Loader(url: url))
         self.loading = loading
         self.failure = failure
     }

     private func selectImage() -> Image {
         switch loader.state {
         case .loading:
             return loading
         case .failure:
             return failure
         default:
             if let image = UIImage(data: loader.data) {
                return Image(uiImage: image).resizable()
             } else {
                 return failure
             }
         }
     }
 }

我的結構 - Indicator() - 代碼

struct Indicator : UIViewRepresentable {
    func makeUIView(context: Context) -> UIActivityIndicatorView {
        let indicator = UIActivityIndicatorView()
        indicator.startAnimating()
        indicator.style = .large
        indicator.color = .systemTeal
        
        return indicator
    }
    
    func updateUIView(_ uiView: UIActivityIndicatorView, context: Context) {
        //
    }
}

此結構 - Indicator() - 應顯示而不是圖像“noconnection”

圖片

我將不勝感激任何幫助

您可以更改failure類型以接受Indicator 然后,將您的selectImage更改為返回some View@ViewBuilder


struct RemoteImage: View {
    
    private enum LoadState {
        case loading, success, failure
    }
    
    private class Loader: ObservableObject {
        var data = Data()
        var state = LoadState.loading
        
        init(url: String) {
            guard let parsedURL = URL(string: url) else {
                fatalError("Invalid URL: \(url)")
            }
            
            URLSession.shared.dataTask(with: parsedURL) { data, response, error in
                if let data = data, data.count > 0 {
                    self.data = data
                    self.state = .success
                } else {
                    self.state = .failure
                }
                
                DispatchQueue.main.async {
                    self.objectWillChange.send()
                }
            }.resume()
        }
    }
    
    @StateObject private var loader: Loader
    var loading: Image
    var failure: Indicator
    
    var body: some View {
        selectImage()
    }
    
    init(url: String, loading: Image = Image("loadingimage").resizable(), failure: Indicator = Indicator()) {
        _loader = StateObject(wrappedValue: Loader(url: url))
        self.loading = loading
        self.failure = failure
    }
    
    @ViewBuilder private func selectImage() -> some View {
        switch loader.state {
        case .loading:
            loading
        case .failure:
            failure
        default:
            if let image = UIImage(data: loader.data) {
                Image(uiImage: image).resizable()
            } else {
                failure
            }
        }
    }
}

在這種情況下,您可能想要擺脫默認參數並只設置var failure = Indicator()而不是使用初始值設定項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM