2012-12-28 16 views
7

मैं अपने ऐप्स में से एक में एक खोज बार जोड़ने की कोशिश कर रहा हूं जो उपयोगकर्ता को पता जानकारी दर्ज करने देता है, और संभावित परिणाम (और एक कीबोर्ड) के साथ एक टेबलव्यू दिखाई देता है। मैप्स ऐप में अनिवार्य रूप से वही कार्यक्षमता प्रदान की जाती है। क्या इसे करने का कोई आसान तरीका है?स्थान खोज परिणाम ओवरले

enter image description here

यह एक वर्तमान स्थान डिफ़ॉल्ट & स्वत: पूर्ण रूप में अच्छी तरह करना अच्छा है, लेकिन आवश्यक नहीं होगा। मैं यूआई को स्क्रैच से बना सकता हूं, लेकिन मुझे नहीं पता कि खोज परिणामों को वापस कैसे प्राप्त किया जाए। क्या मैं जियोकोडर का उपयोग कर सकता हूं और परिणामों को एक टेबलव्यू में पार्स कर सकता हूं?

उत्तर

10

ऐसा करने के लिए एक मानक घटक है, जिसे UISearchDisplayController कहा जाता है।

यह आपको परिणाम प्रदर्शित करने के लिए UISearchBar और UITableView देता है। फिर आप अपनी आवश्यकताओं के अनुसार सामग्री दृश्य और तालिका दृश्य की उपस्थिति को कस्टमाइज़ कर सकते हैं।

ऐसे नियंत्रक द्वारा किए गए कार्यों पर नियंत्रण प्राप्त करने के लिए आपको UISearchDisplayDelegate प्रोटोकॉल के अनुरूप होना होगा।

मैं आपको example app पर ध्यान से देखने के लिए सुझाव देता हूं कि आप दस्तावेज़ पर पा सकते हैं।

संपादित

आदेश स्वतः पूर्ण सुविधाओं आप UISearchDisplayDelegate प्रोटोकॉल के searchDisplayController:shouldReloadTableForSearchString विधि लागू कर सकते हैं लागू करने के लिए। इसे उपयोगकर्ता द्वारा टाइप किए गए प्रत्येक चरित्र पर बुलाया जाएगा।

-(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 कहा जाता है कि और है कि आप एक NSArray संपत्ति placemarks कहा जाता है में स्थान-चिह्न पकड़े हुए हैं, आपके द्वारा एक जीवित स्वतः पूर्ण प्राप्त कर सकते हैं का एक उदाहरण है खोज परिवर्तन के लिए, आप इस स्ट्रिंग का उपयोग करके एक आगे जियोकोडिंग करते हैं। completionHandler ब्लॉक में आप नए पाए गए प्लेसमार्क को अपनी placemarks संपत्ति पर असाइन करें और तालिका को फिर से लोड करें।

कृपया यह न करें कि खोज असीमित है क्योंकि आप पूरा करने वाले हैंडलर में तालिका को पुनः लोड करने और प्रतिनिधि विधि में वापस नहीं लौटने की देखभाल करेंगे। वापस लौटने से पहले खोज खत्म हो जाने से पहले टेबल को फिर से लोड करने के लिए टेबल बनाया जाएगा, जो आप चाहते हैं कि व्यवहार नहीं है।

अंतिम टिप्पणी के रूप में, याद रखें कि मैंने जो कोड प्रदान किया है वह न्यूनतम है। एक वास्तविक दुनिया के ऐप में आप बेहतर ढंग से त्रुटियों का ख्याल रखेंगे जो geocoder चला सकता है, जैसे kCLErrorGeocodeFoundNoResult, kCLErrorGeocodeFoundPartialResult और kCLErrorGeocodeCanceled, here दस्तावेज।

+0

यह चीजों के यूआई पक्ष के लिए बहुत अच्छा काम करता है। मेरे प्रश्न के दूसरे भाग पर कोई विचार, खोज परिणाम? मैं UISearchBar में टाइपिंग शुरू करने में सक्षम होना चाहता हूं और तालिका में संभावित स्थान दिखाना चाहता हूं (मैं ऐप्पल मैप्स का उपयोग कर रहा हूं)। –

+0

@JamesWeir मेरे अपडेट किए गए उत्तर की जांच करें। –

+0

ठीक है, सबकुछ अब काम कर रहा है, लेकिन परिणाम वह नहीं हैं जो मैं उम्मीद कर रहा था। CLGeocoder सबसे बड़ा परिणाम नहीं देता है। उदाहरण के लिए, ऊपर दिए गए स्क्रीनशॉट में "ऐप्पल" की खोज करने से सड़क के पते पर आधारित केवल 2 हिट पैदा होती हैं। ऐप्पल दस्तावेज़ों को देखते हुए वे उल्लेख करते हैं कि CLGeocoder का उपयोग करके अपने मुख्यालय को खोजने के लिए आपको '1 अनंत लूप, कूपर्टिनो, सीए' खोजना होगा।क्या नक्शा ऐप yeilds (जैसे उपरोक्त तस्वीर में) के प्रकार के खोज परिणाम प्राप्त करने का कोई तरीका नहीं है। लक्ष्य उपयोगकर्ता के लिए स्थान खोजना आसान बनाना था - सटीक पता जानकारी की आवश्यकता नहीं है। –

संबंधित मुद्दे