我試圖添加一個搜索欄到我的一個應用程序,讓用戶輸入地址信息,並出現一個表視圖與可能的結果(和鍵盤)。基本上與地圖應用程序中提供的功能相同。是否有捷徑可尋?位置搜索結果覆蓋
這將是不錯的當前位置的默認&自動完成爲好,但不是必需的。我可以從頭構建UI,但我不知道如何取回搜索結果。我可以使用geocoder並將結果解析爲tableview嗎?
我試圖添加一個搜索欄到我的一個應用程序,讓用戶輸入地址信息,並出現一個表視圖與可能的結果(和鍵盤)。基本上與地圖應用程序中提供的功能相同。是否有捷徑可尋?位置搜索結果覆蓋
這將是不錯的當前位置的默認&自動完成爲好,但不是必需的。我可以從頭構建UI,但我不知道如何取回搜索結果。我可以使用geocoder並將結果解析爲tableview嗎?
這樣做有一個標準組件,稱爲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
,kCLErrorGeocodeFoundPartialResult
和kCLErrorGeocodeCanceled
,記錄爲here。
這對於事物的UI方面非常有用。關於我的問題的第二部分,搜索結果有什麼想法?我希望能夠開始在UISearchBar中輸入,並在表中顯示可能的位置(我假設使用Apple Maps)。 –
@JamesWeir檢查我更新的答案。 –
好的,現在一切正在進行,但結果並不是我所希望的。 CLGeocoder並沒有給出最大的結果。例如,像上面屏幕截圖一樣搜索「Apple」只會根據街道地址獲得2次點擊。看看蘋果公司的文檔,他們提到要使用CLGeocoder找到他們的總部,你必須搜索'1 Infinite Loop,Cupertino,CA'。沒有辦法獲得地圖應用程序可用的搜索結果類型(如上圖所示)。目標是讓用戶輕鬆進行位置搜索 - 而不是要求精確的地址信息。 –