UISearchDisplayControllerという標準コンポーネントがあります。
結果を表示するためにUISearchBar
とUITableView
が表示されます。 次に、必要に応じてテーブルビューのコンテンツと外観をカスタマイズできます。
このようなコントローラで実行されるアクションを制御するには、UISearchDisplayDelegateプロトコルに準拠する必要があります。
example appをよくお読みになることをお勧めします。あなたがUISearchDisplayDelegate
プロトコルのsearchDisplayController:shouldReloadTableForSearchString
方法を実装することができ、オートコンプリート機能を実装するために
EDIT
。これは、ユーザーが入力したすべての文字で呼び出されます。毎回
-(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;
}
入力文字列:あなたはCLGeocoder
プロパティがgeocoder
と呼ばれ、あなたがplacemarks
と呼ばれるNSArray
プロパティに目印を保持している、ここであなたが生きて自動補完を実現することができる方法の一例だとしていると仮定すると
検索変更の場合、そのような文字列を使用して順方向ジオコーディングを実行します。 completionHandler
ブロックでは、新しく見つかった目印をplacemarks
プロパティに割り当てて、テーブルをリロードします。
検索が非同期であるため、完了ハンドラでテーブルをリロードし、デリゲートメソッドでNOを返すようにしてください。 YESを返すと、検索が終了する前にテーブルがリロードされます。これは必要な動作ではありません。
最後に、私が提供したコードは最小限であることを覚えておいてください。実際のアプリケーションでは、kCLErrorGeocodeFoundNoResult
、kCLErrorGeocodeFoundPartialResult
、kCLErrorGeocodeCanceled
など、ジオコーダが実行する可能性のあるエラーを処理することをお勧めします。hereと記載されています。
これは物事のUI側に最適です。私の質問の2番目の部分にあるアイデアは、検索結果ですか?私はUISearchBarの入力を開始し、可能な場所をテーブルに表示させたいと考えています(私はApple Mapsを使用していると仮定しています)。 –
@JamesWeirは更新された回答をチェックします。 –
さて、すべてが動作していますが、結果は私が望んでいたものではありません。 CLGeocoderは最大の結果を出しません。たとえば、上記のスクリーンショットのように「Apple」を検索すると、住所を基準にして2回しかヒットしません。 Appleのドキュメントを見ると、CLGeocoderを使ってHQを見つけるには、「1 Infinite Loop、Cupertino、CA」を検索する必要があると言います。上記の図のように、マップアプリが楽しむ検索結果を得る方法はありません。目標は、正確な住所情報を必要としないように、ユーザーが場所を簡単に検索できるようにすることでした。 –