观察自定义视图 SwiftUI 中的属性变化

Posted

技术标签:

【中文标题】观察自定义视图 SwiftUI 中的属性变化【英文标题】:Observe property change in custom view 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 视图并使其工作?

谢谢

【问题讨论】:

【参考方案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 的值不会在正确的时间改变(似乎有点随机)

以上是关于观察自定义视图 SwiftUI 中的属性变化的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI-自定义容器

SwiftUI 接收自定义事件

如何实现一个自定义属性包装器,它将发布 SwiftUI 的更改以重新呈现它的视图

样式视图传递给 SwiftUI 中的自定义视图

关闭自定义模式/覆盖不更新 SwiftUI 中的视图内容

NavigationView中的SwiftUI自定义动画过渡?