异步加载的图像在同一视图内不可重复使用
Asynchronous loaded Image is not reusable inside the same view
我的异步图像有问题。
这是文件的 link
https://www.vadimbulavin.com/asynchronous-swiftui-image-loading-from-url-with-combine-and-swift/
底部栏的图像不会因按钮操作而改变。我该如何解决它,你能解释一下吗?
podcastIndex 是 PodcastParser 中的@Publisched Class
文字变了没问题,但图片总是一样的。
这是我的内容视图:
struct ContentView: View {
@ObservedObject var podcastParser = PodcastParser()
init() {
podcastParser.loadData()
}
var body: some View {
NavigationView {
List(podcastParser.podcasts.indices) { index in
HStack {
Button(action: {
podcastParser.podcastIndex = index
print(podcastParser.podcasts[podcastParser.podcastIndex].imageUrl)
}) {
HStack {
AsyncImage(
url: podcastParser.podcasts[index].imageUrl,
placeholder: {
Text("Loading...")
},
image: { Image(uiImage: [=10=]).resizable() }
)
.scaledToFit()
.frame(width: 50, height: 50)
Text(podcastParser.podcasts[index].name)
}
}
}
}
}
VStack {
HStack {
AsyncImage(
url: podcastParser.podcasts[podcastParser.podcastIndex].imageUrl,
placeholder: {
Text("Loading...")
},
image: { Image(uiImage: [=10=]).resizable() }
)
.scaledToFit()
.frame(width: 50, height: 50)
Text(podcastParser.podcasts[podcastParser.podcastIndex].name)
}
}
}
}
通常,当您遇到此类问题时,总有一种蛮力解决方案可以使用 id
修饰符强制更新视图。
AsyncImage(
url: podcastParser.podcasts[podcastParser.podcastIndex].imageUrl,
placeholder: {
Text("Loading...")
},
image: { Image(uiImage: [=10=]).resizable() }
).id(podcastParser.podcasts[podcastParser.podcastIndex].imageUrl)
对于系统 AsyncImage
,这将是唯一的解决方案,但在您的情况下,您使用的是开源 solition,因此可以对其进行修改以解决问题。
在 AsyncImage.swift
中用 ObservedObject
替换 StateObject
解决了这种情况下的问题。我对这个库使用相同的方法,到目前为止没有遇到任何问题。
我的异步图像有问题。
这是文件的 link https://www.vadimbulavin.com/asynchronous-swiftui-image-loading-from-url-with-combine-and-swift/
底部栏的图像不会因按钮操作而改变。我该如何解决它,你能解释一下吗?
podcastIndex 是 PodcastParser 中的@Publisched Class
文字变了没问题,但图片总是一样的。
这是我的内容视图:
struct ContentView: View {
@ObservedObject var podcastParser = PodcastParser()
init() {
podcastParser.loadData()
}
var body: some View {
NavigationView {
List(podcastParser.podcasts.indices) { index in
HStack {
Button(action: {
podcastParser.podcastIndex = index
print(podcastParser.podcasts[podcastParser.podcastIndex].imageUrl)
}) {
HStack {
AsyncImage(
url: podcastParser.podcasts[index].imageUrl,
placeholder: {
Text("Loading...")
},
image: { Image(uiImage: [=10=]).resizable() }
)
.scaledToFit()
.frame(width: 50, height: 50)
Text(podcastParser.podcasts[index].name)
}
}
}
}
}
VStack {
HStack {
AsyncImage(
url: podcastParser.podcasts[podcastParser.podcastIndex].imageUrl,
placeholder: {
Text("Loading...")
},
image: { Image(uiImage: [=10=]).resizable() }
)
.scaledToFit()
.frame(width: 50, height: 50)
Text(podcastParser.podcasts[podcastParser.podcastIndex].name)
}
}
}
}
通常,当您遇到此类问题时,总有一种蛮力解决方案可以使用 id
修饰符强制更新视图。
AsyncImage(
url: podcastParser.podcasts[podcastParser.podcastIndex].imageUrl,
placeholder: {
Text("Loading...")
},
image: { Image(uiImage: [=10=]).resizable() }
).id(podcastParser.podcasts[podcastParser.podcastIndex].imageUrl)
对于系统 AsyncImage
,这将是唯一的解决方案,但在您的情况下,您使用的是开源 solition,因此可以对其进行修改以解决问题。
在 AsyncImage.swift
中用 ObservedObject
替换 StateObject
解决了这种情况下的问题。我对这个库使用相同的方法,到目前为止没有遇到任何问题。