7

ユーザーが住所情報を入力できる検索バーをアプリの1つに追加しようとすると、可能な結果(およびキーボード)を含むテーブルビューが表示されます。基本的に、マップアプリで提供されるのと同じ機能。これを行う簡単な方法はありますか?

ここに画像の説明を入力してください

現在地のデ​​フォルトとオートコンプリートがあると便利ですが、必須ではありません。UIを最初から作成することはできますが、検索結果を取得する方法がわかりません。ジオコーダーを使用して、結果をテーブルビューに解析できますか?

4

1 に答える 1

10

これを行うためのUISearchDisplayControllerと呼ばれる標準コンポーネントがあります。

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

このようなコントローラーによって実行されるアクションを制御するには、UISearchDisplayDelegateプロトコルに準拠する必要があります。

ドキュメントにあるサンプルアプリを注意深く確認することをお勧めします。

編集

オートコンプリート機能を実装するために、プロトコルのsearchDisplayController:shouldReloadTableForSearchStringメソッドを実装できます。UISearchDisplayDelegateユーザーが入力したすべての文字で呼び出されます。

CLGeocoderと呼ばれるプロパティがあり、と呼ばれるプロパティgeocoderに目印を保持していると仮定すると、ライブオートコンプリートを実現する方法の例を次に示します。NSArrayplacemarks

-(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

于 2012-12-28T06:00:42.120 に答える