【问题标题】:How to change an image to a structure? SwiftUI如何将图像更改为结构? SwiftUI
【发布时间】:2021-12-14 02:36:54
【问题描述】:

现在,当打开应用程序时,会显示来自链接的图像,但如果用户没有互联网,则会显示来自我的应用程序文件的图像

如果用户没有互联网连接,如何代替我的图像 - 名称:“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() - 应该显示而不是图像“无连接”

如果有任何帮助,我将不胜感激

【问题讨论】:

    标签: ios swift xcode swiftui ios15


    【解决方案1】:

    您可以更改您的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() 而不是使用初始化程序

    【讨论】:

      猜你喜欢
      • 2018-08-16
      • 2016-11-28
      • 2023-02-20
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多