酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

SwiftUI で検索モードを解除する。dismissSearch() は searchableモディファイアを設定したViewの 子View でないと使えない

本文はあとで書く。

developer.apple.com

dismissSearch() を実行すれば、検索モードがオフになり、検索バーに入力していたテキストもキーボードも消える。

  • Sets isSearching to false.
  • Clears any text from the search field.
  • Removes focus from the search field.

当初は、以下のように実装した。しかし dismissSearch() を実行してもうまく動かなかった。

struct ParentView: View {
    @State private var searchText = ""

    @Environment(\.dismissSearch) private var dismissSearch
    
    var body: some View {
        VStack {
            Text(searchText)
            Button(action: { dismissSearch() } ) {
                Text("Dissmiss search")
            }
        }
            .searchable(text: $searchText)
    }
}

dismissSearch() は searchable モディファイアを設定した、子View でないと有効ではなかった。

struct ParentView: View {
    @State private var searchText = ""

    var body: some View {
        ChildView(searchText: searchText)
            .searchable(text: $searchText)
    }
}

struct ChildView: View {
    @Environment(\.dismissSearch) private var dismissSearch

    let searchText: String

    var body: some View {
        Text(searchText)
        Button(action: { dismissSearch() } ) {
            Text("Dissmiss search")
        }
    }
}