观察自定义视图 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 中的属性变化的主要内容,如果未能解决你的问题,请参考以下文章