検索結果を表示する LazyVGrid があります。検索フィールドに文字を入力すると、CoreData フェッチ リクエストが実行され、@Published
プロパティが更新されます。
問題:
LazyVGrid は、現在スクロールしている場合を除き、期待どおりに結果を更新します。この場合、スクロールが減速して終了するのを待ってから更新します。
比較のために、UIKit では UICollectionView を使用してそれを呼び出すことができ、.reloadData()
スクロールするかどうかに関係なく、グリッドをすぐに更新します。
テスト目的で、次のことを試しましたが成功しませんでした。
.animation(nil)
ビュー修飾子を追加.id(UUID())
ビュー修飾子を追加- ビューを更新したいときにaを更新
@State var dummy = ""
し、ビューの本文で使用します。Text(dummy)
以下は、このことがどのように機能するかを視覚化するのに役立つコードです
struct SearchResultGroup: Hashable {
let title: String?
let list: [Foo] // Foo is a NSManagedObject class representation
}
class SearchResultsHolder: ObservableObject {
@Published var results: [SearchResultGroup] = []
}
struct SearchResultsSV: View {
@ObservedObject var searchResultsHolder: SearchResultsHolder // searchResults.results property gets updated externally
var body: some View {
LazyVGrid(columns: [GridItem(.adaptive(minimum: 30))]) {
ForEach(searchResultsHolder.results, id: \.self) { section in
Section(header: Text( section.title ?? ""))
, content: {
ForEach(section.list, id: \.id) { foo in
Text(foo.bar)
}
})
}
}
}
スクロールアニメーションの実行中にLazyVGridでコンテンツイベントを更新する方法はありますか? そうしないと、ユーザーにとって反応が鈍く感じられます。