1

我有一个有条件地显示子视图的父视图:

struct HomeView: View {    
    @State var selectedView = true

    var body: some View {
        VStack {
            Picker("Selected", selection: $selectedView) {
                Text("A").tag(true)
                Text("B").tag(false)
            }.pickerStyle(SegmentedPickerStyle())
            
            if selectedView {
                SubView()
            } else {
                Text("Other")
            }
        }
    }
}

我的子视图包含一个AsyncImage从 URL 加载的:

struct SubView: View {
    private let url = URL(string: "some url here")
    var body: some View {
        AsyncImage(url: url)
    }
}

我的问题是SubView每次我将选择器切换到 B 然后再切换回 A 时都会重新创建它。这会重新创建AsyncImage并导致从 URL 重新加载,这不是必需的。

有没有办法防止SubView在这里被重新创建?我注意到TabView在它们之间切换时似乎没有重新创建其包含的视图。是否可以使用我拥有的结构获得此功能?

我已经尝试使SubViewequatable 并.equatable()在其实例上使用修饰符,如下所示:

if selectedView {
    SubView().equatable()
} else {
    Text("Other")
}

但是,图像仍会重新加载。

4

1 回答 1

1

要么摆脱if创建 a_ConditionalView并使用修饰符,要么启用URLSession'sURLCache以便图像缓存在内存或磁盘中,并且实际上不会再次下载。

于 2022-01-29T19:12:17.910 回答