2012-12-28 18 views
7

ユーザーがアドレス情報を入力できる検索バーをアプリケーションの1つに追加しようとしています。テーブルビューに結果とキーボードが表示されます。基本的に地図アプリで提供されているのと同じ機能です。これを行う簡単な方法はありますか?場所検索結果オーバーレイ

enter image description here

それだけでなく、現在の地域のデフォルト&オートコンプリートを持っているのはいいが、必要ではないだろう。最初からUIを構築できますが、検索結果を取得する方法はわかりません。ジオコーダーを使用して、結果を解析してテーブルビューにすることはできますか?

答えて

10

UISearchDisplayControllerという標準コンポーネントがあります。

結果を表示するためにUISearchBarUITableViewが表示されます。 次に、必要に応じてテーブルビューのコンテンツと外観をカスタマイズできます。

このようなコントローラで実行されるアクションを制御するには、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を返すと、検索が終了する前にテーブルがリロードされます。これは必要な動作ではありません。

最後に、私が提供したコードは最小限であることを覚えておいてください。実際のアプリケーションでは、kCLErrorGeocodeFoundNoResultkCLErrorGeocodeFoundPartialResultkCLErrorGeocodeCanceledなど、ジオコーダが実行する可能性のあるエラーを処理することをお勧めします。hereと記載されています。

+0

これは物事のUI側に最適です。私の質問の2番目の部分にあるアイデアは、検索結果ですか?私はUISearchBarの入力を開始し、可能な場所をテーブルに表示させたいと考えています(私はApple Mapsを使用していると仮定しています)。 –

+0

@JamesWeirは更新された回答をチェックします。 –

+0

さて、すべてが動作していますが、結果は私が望んでいたものではありません。 CLGeocoderは最大の結果を出しません。たとえば、上記のスクリーンショットのように「Apple」を検索すると、住所を基準にして2回しかヒットしません。 Appleのドキュメントを見ると、CLGeocoderを使ってHQを見つけるには、「1 Infinite Loop、Cupertino、CA」を検索する必要があると言います。上記の図のように、マップアプリが楽しむ検索結果を得る方法はありません。目標は、正確な住所情報を必要としないように、ユーザーが場所を簡単に検索できるようにすることでした。 –