ユーザーが住所情報を入力できる検索バーをアプリの1つに追加しようとすると、可能な結果(およびキーボード)を含むテーブルビューが表示されます。基本的に、マップアプリで提供されるのと同じ機能。これを行う簡単な方法はありますか?
現在地のデフォルトとオートコンプリートがあると便利ですが、必須ではありません。UIを最初から作成することはできますが、検索結果を取得する方法がわかりません。ジオコーダーを使用して、結果をテーブルビューに解析できますか?
これを行うためのUISearchDisplayControllerと呼ばれる標準コンポーネントがあります。
結果を表示するためのUISearchBar
とを提供します。UITableView
次に、必要に応じてテーブルビューのコンテンツと外観をカスタマイズできます。
このようなコントローラーによって実行されるアクションを制御するには、UISearchDisplayDelegateプロトコルに準拠する必要があります。
ドキュメントにあるサンプルアプリを注意深く確認することをお勧めします。
編集
オートコンプリート機能を実装するために、プロトコルのsearchDisplayController:shouldReloadTableForSearchString
メソッドを実装できます。UISearchDisplayDelegate
ユーザーが入力したすべての文字で呼び出されます。
CLGeocoder
と呼ばれるプロパティがあり、と呼ばれるプロパティgeocoder
に目印を保持していると仮定すると、ライブオートコンプリートを実現する方法の例を次に示します。NSArray
placemarks
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
[self.geocoder geocodeAddressString:searchString completionHandler:^(NSArray *placemarks, NSError *error) {
self.placemarks = placemarks;
[self.searchDisplayController.searchResultsTableView reloadData];
}];
return NO;
}
検索の入力文字列が変更されるたびに、そのような文字列を使用して前方ジオコーディングを実行します。ブロックで、completionHandler
新しく見つかった目印をplacemarks
プロパティに割り当て、テーブルをリロードします。
検索は非同期であるため、完了ハンドラーでテーブルを再ロードし、デリゲートメソッドでNOを返すことに注意してください。YESを返すと、検索が終了する前にテーブルがリロードされますが、これは目的の動作ではありません。
最後に、私が提供したコードは最小限であることを忘れないでください。実際のアプリでは、ここに記載されているkCLErrorGeocodeFoundNoResult
、、kCLErrorGeocodeFoundPartialResult
などのジオコーダーが遭遇する可能性のあるエラーに注意する必要があります。kCLErrorGeocodeCanceled