【问题标题】:Observe property change in custom view SwiftUI观察自定义视图 SwiftUI 中的属性变化
【发布时间】:2021-07-28 21:46:59
【问题描述】:

我创建了一个自定义视图 NetworkImage,用于异步加载图像。

import Combine
import SwiftUI

struct NetworkImage<Placeholder: View>: View {
    @StateObject private var viewModel = NetworkImageViewModel()
    let url: String?
    let placeholder: Placeholder
    let saveLocally:Bool
    
    init(_ url: String?, @ViewBuilder placeholder: () -> Placeholder, saveLocally:Bool = false) {
        self.url = url
        self.placeholder = placeholder()
        self.saveLocally = saveLocally
    }
    
    func loadImage(_ url:String?)  {
        if let url = url {
            viewModel.loadImage(from: url, saveLocally: saveLocally)
        }
    }
    
    var body: some View {
        Group {
            if let uiImage = viewModel.image {
                Image(uiImage: uiImage)
                    .resizable()
            } else {
                placeholder
            }
        }
        .onAppear {
            if let url = url {
                viewModel.loadImage(from: url, saveLocally: saveLocally)
            }
        }
    }
}

我在我的观点中使用了它,它工作得非常好。但是现在我希望能够在每次 url 更改时用新图像替换图像。 我怎样才能做到这一点?如何将我的视图视图模型的 @Published 属性传递给此 NetworkImage 视图并使其工作?

谢谢

【问题讨论】:

    标签: view swiftui combine


    【解决方案1】:

    使用onChange修饰符查看url参数是否发生了变化:

    struct NetworkImage<Placeholder: View>: View {
        @StateObject private var viewModel = NetworkImageViewModel()
        let url: String?
        let placeholder: Placeholder
        let saveLocally:Bool = false
        
        func loadImage(_ url:String?)  {
            if let url = url {
                viewModel.loadImage(from: url, saveLocally: saveLocally)
            }
        }
        
        var body: some View {
            Group {
                if let uiImage = viewModel.image {
                    Image(uiImage: uiImage)
                        .resizable()
                } else {
                    placeholder
                }
            }
            .onAppear {
                self.loadImage(url)
            }
            .onChange(of: url) { url in
                self.loadImage(url)
            }
        }
    }
    

    【讨论】:

    • 谢谢。只有一件事我不明白:如果我在 loadImage() 中使用 self.url 的值,这将不起作用。 self.saveLocally 也一样。我想听一下 saveLocally 的变化并将其与 loadImage(url, saveLocally) 一起使用,但 saveLocally 的值不会在正确的时间改变(似乎有点随机)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2011-05-27
    • 1970-01-01
    • 2013-10-24
    • 2017-11-18
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多