[SwiftUI][CoreData] SwiftUI と MVVM で始める CoreData 入門 (その12:Priority に沿ったソートの追加)

SwiftUI と CoreData を組み合わせたアプリの作り方を説明します。

環境&対象

以下の環境で動作確認を行なっています。

  • maxOS Catalina 10.15.7
  • Xcode 12.3
  • iOS 14.2

ソートの追加

TODOItem に Priority を追加したので、リストのソートも、タイトル順だけでなく、プライオリティ順のソートも追加してみます。

ソート実装方針

Model が ソート順(NSSortDescriptor) を受け取り、ソート済み配列を返しているので、Model に渡す NSSortDescriptor を 外部から調整すれば良いことになります。

ViewModel で 適切な NSSortDescriptor を管理し、Model に渡すことにします。

テストは、Model を対象にしたものと、View を対象にしたもので行います。

ソート順を指定する UI は、Toolbar を使ってみます。

ソートの実装

Model のテスト

CoreData を疑うわけではないですが、以下のようなテストを作成しました。

# 自分で作成する NSSortDescriptor のチェックも兼ねてます

test_variousSort_PriorityOrName_sortAccordingly
コード解説
  1. NSSortDescriptor を準備
  2. 複数のプライオリティでモデルを作成
  3. Title でソートして順番をテスト
  4. Priority でソートして順番をテスト

Model の実装

Priority 順ソートの時にも2番目のソート種類として Title を渡したいので、Model の filteredItems の引数として、複数の NSSortDescriptor を受け取れるようにします。

TODOItemStore.filteredItems

上記のコードで、Model のテストコードはパスするようになります。

View の テスト

以下のようなテストを作成しました。 プライオリティ順だけでなく、タイトル順でも適切にソートされるかをテストします。

リスト上の表示を取得できないため、個別 Item の詳細ページに遷移してテストしています。

test_variousSort_nameSortOrPrioSort_shouldBeSortedAccordingly

View の実装を行う前に、テストコードを整備する必要があります。
具体的には、Toolbar に追加するソートボタンを TODOListPageObject に追加する必要があります。

TODOListPageObject
コード解説
  1. タイトル順ソートボタン、プライオリティ順ソートボタンを取得
  2. タイトル順ソートボタン押下メソッド
  3. プライオリティ順ソートボタン押下メソッド

これで、View のテストも完成しました。

View/ViewModel の実装

View としては、MyTODOMainView にソートを指定するボタンを追加します。

MyTODOMainView が大きくなってきたので、Toolbar 部分のみ抜粋します

ToolbarItemGroup

[SwiftUI] toolbar の使い方

なお、現時点では、Toolbar に配置した時の AccessibilityID で UI 要素の取得はできませんでした。

ViewModel は、ソート指定用の NSSortDescriptor を保持し、View から指定されたソート方法を使って、Model から TODOItem のリストを受け取れるよう設定します。

example

今回の実装で、タイトルだけでなく、プライオリティ順に表示することもできるようになりました。

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です