2

検索結果を表示する 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でコンテンツイベントを更新する方法はありますか? そうしないと、ユーザーにとって反応が鈍く感じられます。

4

0 に答える 0