スコープにより検索対象となる範囲を絞って検索するフィールドの作成【searchScopes】

この記事は約6分で読めます。
  • iOS:16.4以上
  • XCode(当サイトの環境):15.0.1

検索機能におけるスコープとは、検索対象となる範囲や領域のことを指します。
スコープは、ユーザーが検索を行う際に検索対象を限定するために使用することができます。
特定の領域に絞った検索を行うことで、効率的に目的の情報を見つけるインタフェースを構築できるようになります。

検索スコープとは?使い方とサンプルコード

検索スコープとは?

SwiftUIにおける検索機能では、スコープを指定することで検索対象を限定することができます。具体的には、検索可能なビュー内で検索フィールドを使用する場合、searchScopesモディファイアを使用してスコープを指定することができます。

例えば、検索可能な食べ物のリストがあるとします。このリストには複数の食べ物の項目が含まれていますが、特定の項目(野菜や果物)に絞って効率的に検索を行いたい場合があります。
このような場合、searchScopesを使用して検索の対象を絞ることができます。

サンプルコード

以下は、検索可能なリストでスコープを使用する例です。

import SwiftUI

struct SearchableSmp: View {
    enum FoodCategory {
      case all
      case fruit
      case vegetable
    }
    struct Food: Identifiable {
      let id = UUID()
      let name: String
      let category: FoodCategory
    }
    // フードの一覧
    let foods: [Food] = [
      .init(name: "Apple", category: .fruit),
      .init(name: "Banana", category: .fruit),
      .init(name: "Orange", category: .fruit),
      .init(name: "Grapes", category: .fruit),
      .init(name: "Strawberry", category: .fruit),
      .init(name: "Carrot", category: .vegetable),
      .init(name: "potato", category: .vegetable),
      .init(name: "Eggplant", category: .vegetable),
    ]
    // 検索文字列を格納
    @State private var searchText = ""
    // フードカテゴリを格納
    @State private var foodCategory: FoodCategory = .all
    // 検索語句でフィルタした文字列を格納
    var filteredItems: [Food] {
        if foodCategory == .all {
            if searchText.isEmpty {
                return foods // 検索テキストが空の場合は全ての項目を表示
            } else {
                return foods.filter { $0.name.localizedCaseInsensitiveContains(searchText) } // 検索テキストに基づいてフィルタリング
            }
        }
        else {
            return foods
                .filter { $0.category == foodCategory }
                .filter { $0.name.localizedCaseInsensitiveContains(searchText) }
        }
    }
    
    var body: some View {
        NavigationStack {
            //フード一覧
            List(filteredItems) { food in
                Text(food.name)
            }
            // 検索フィールドを表示
            .searchable(text: $searchText)
            // 検索スコープを設定
            .searchScopes($foodCategory) {
                Text("全て").tag(FoodCategory.all)
                Text("果物").tag(FoodCategory.fruit)
                Text("野菜").tag(FoodCategory.vegetable)
            }
        }
    }
}

この例では、検索可能なリストに3つのスコープ(”全て”, “果物”, “野菜”)があります。
検索フィールドの下にスコープセレクターが表示され、ユーザーは検索のスコープを選択することができます。
ユーザーが特定のスコープを選択すると、そのスコープに応じて検索の対象が変わります。

スコープを使用することで、検索対象を限定することができ、ユーザーが効率的に目的の情報を見つける手助けとなります。

SearchScopeが表示されるタイミングを制御するには?【SearchScopeActivation】

デフォルトの動作では、検索フィールドに文字列を入力したタイミングで、検索スコープのリストが表示されます。

このスコープの表示タイミングを変更することも可能です。

サンプルコードのカスタマイズ

上記のサンプルコードにおいて、検索スコープを設定している行に『Activation』のパラメータを追加してみましょう。

// 検索スコープを設定
.searchScopes($foodCategory) {
// 検索スコープを設定
.searchScopes($foodCategory, activation: .onSearchPresentation) {

パラメータによる動作の違い

  • onTextEntry:検索フィールドにテキストを入力したタイミングでスコープを表示
  • onSearchPresentation:検索フィールドをアクティブにしたタイミングでスコープを表示

automaticの場合は、onTextEntryと同様の動作です。

onTextEntry
onSearchPresentation

まとめ

searchScopesにより、検索スコープを設定すると、アプリの検索機能をさらに便利にすることができます。

若干ではありますが、スコープの表示タイミングをカスタマイズしたりと、独自のカスタマイズも可能です。

実装の手間が少し増えますが、検索機能を実装する際には、よければ参考にしてください。

タイトルとURLをコピーしました