import SwiftUI
struct ContentView: View {
private var items = Array(1...20)
@State var word = ""
var filteredItems: [Int] {
word.isEmpty ? items : items.filter{"\($0)".contains(word)}
}
var body: some View {
VStack {
TextField("Search", text: $word)
.textFieldStyle(RoundedBorderTextFieldStyle())
.frame(width: 300)
.padding()
List(filteredItems, id: \.self) {
Text("item \($0)")
}
}
}
}
少ないアイテム数ならアニメーション/トランジション効果があっても問題はないが、アイテムが増えると重くなり最悪フリーズ状態に。
重くなる原因は表示変更の効果計算がアイテム毎に行われている為。
その計算を行わないようにする為に新たにリストを作り出して入れ替えるという形にすると瞬時に表示される。
具体的にはList{〜}.id(UUID())と更新の度にユニークidを付加するだけ。
import SwiftUI
struct ContentView: View {
private var items = Array(1...10000)
@State var word = ""
var filteredItems: [Int] {
word.isEmpty ? items : items.filter{"\($0)".contains(word)}
}
var body: some View {
VStack {
TextField("Search", text: $word)
.textFieldStyle(RoundedBorderTextFieldStyle())
.frame(width: 300)
.padding()
List(filteredItems, id: \.self) {
Text("item \($0)")
}.id(UUID())
}
}
}
ネタ元: https://www.hackingwithswift.com/articles/210/how-to-fix-slow-list-updates-in-swiftui

