swiftui - SwiftUI TabView Page 如何处理大数据
问题描述
我用TabView浏览相册是因为我需要一个分页功能,但是我的相册有上千张图片,而且TabView处理起来很慢。有什么方法可以延迟加载,以便 TabView 可以处理数千个数据。
TabView(selection: $assetModel.identifier) {
ForEach(0..<7000) { index in
let asset = assetModel.assetArray[index]
AssetPreviewItemView(asset: asset)
.tag(asset.localIdentifier)
}
}
.tabViewStyle(.page(indexDisplayMode: .always))
.indexViewStyle(.page(backgroundDisplayMode: .always))
解决方案
目前(Xcode13.2.1),每次更改 TabView 的选择(每次滑动图像)时,TabView 都会初始化所有 7000 个 AssetPreviewItemView,这就是它如此滞后的原因。
正如我到目前为止所发现的(真的希望我错了),您可以在不加载所有内容的情况下滑动页面选项卡视图的唯一方法是@State
仅用于索引(将您的替换为from之$assetModel.identifier
类的东西)。$identifier
@State var identifier
您可以在我的测试代码中看到每个滑动页面的 TestTabPageViewCell 初始化 7000 次:
import SwiftUI
struct TestTabPageView: View {
@StateObject private var viewModel = TestTabPageViewModel()
var body: some View {
VStack {
TabView(selection: $viewModel.index) {
ForEach((0..<7000), id: \.self) { i in
TestTabPageViewCell(content: "\(i)").tag(i)
}
}
.tabViewStyle(.page(indexDisplayMode: .always))
}
}
}
class TestTabPageViewModel: ObservableObject {
@Published var index = 0
}
struct TestTabPageViewCell: View {
var content: String
init(content: String) {
self.content = content
print("init \(content)")
}
var body: some View {
Text(content)
}
}
要摆脱 7000 个初始化,您必须将索引保留为私人使用
struct TestTabPageView: View {
@State var index = 0
var body: some View {
VStack {
TabView(selection: $index) {
ForEach((0..<7000), id: \.self) { i in
TestTabPageViewCell(content: "\(i)").tag(i)
}
}
.tabViewStyle(.page(indexDisplayMode: .always))
}
}
}
推荐阅读
- sql - 相同的 SQL 查询在 PostgreSQL 和 NodeJS 中使用 Date 给出不同的输出
- coq - 有人知道 mult 在 coq 中是如何工作的吗?
- javascript - 我无法通过 fetch API 获取 XML 数据 - 被 CORS 策略阻止
- java - 在 Spring Boot REST API 中设置默认响应内容类型
- asp.net-core - 序列在找到元素一次时不包含匹配元素
- angular - FireStore 聊天结构
- c# - Blazor WASM,如何实现自定义 post OIDC 登录逻辑
- php - 在 laravel 8 模型工厂中给出数组错误
- python - 对 MNIST 数据使用 shift()。得到奇怪的结果
- c# - php之间的加密C#我尝试过,但输出仍然不同