2012-12-28 62 views
7

我試圖添加一個搜索欄到我的一個應用程序,讓用戶輸入地址信息,並出現一個表視圖與可能的結果(和鍵盤)。基本上與地圖應用程序中提供的功能相同。是否有捷徑可尋?位置搜索結果覆蓋

enter image description here

這將是不錯的當前位置的默認&自動完成爲好,但不是必需的。我可以從頭構建UI,但我不知道如何取回搜索結果。我可以使用geocoder並將結果解析爲tableview嗎?

回答

10

這樣做有一個標準組件,稱爲UISearchDisplayController

它給你一個UISearchBar和一個UITableView顯示結果。 然後您可以根據您的需要自定義表格視圖的內容和外觀。

爲了控制此控制器執行的操作,您需要遵守UISearchDisplayDelegate協議。

我建議你仔細看看example app你可以找到文件。

EDIT

爲了實現可以實現UISearchDisplayDelegate協議的searchDisplayController:shouldReloadTableForSearchString方法自動完成功能。它將在用戶鍵入的每個字符處被調用。

假設你有一個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,kCLErrorGeocodeFoundPartialResultkCLErrorGeocodeCanceled,記錄爲here

+0

這對於事物的UI方面非常有用。關於我的問題的第二部分,搜索結果有什麼想法?我希望能夠開始在UISearchBar中輸入,並在表中顯示可能的位置(我假設使用Apple Maps)。 –

+0

@JamesWeir檢查我更新的答案。 –

+0

好的,現在一切正在進行,但結果並不是我所希望的。 CLGeocoder並沒有給出最大的結果。例如,像上面屏幕截圖一樣搜索「Apple」只會根據街道地址獲得2次點擊。看看蘋果公司的文檔,他們提到要使用CLGeocoder找到他們的總部,你必須搜索'1 Infinite Loop,Cupertino,CA'。沒有辦法獲得地圖應用程序可用的搜索結果類型(如上圖所示)。目標是讓用戶輕鬆進行位置搜索 - 而不是要求精確的地址信息。 –