2012-03-10 16 views
17

का पता लगाने के मैं एक UISearchbar कि एक यूआरएल से जानकारी पुनः प्राप्त लागू करने खोज रहा हूँ, और डिफ़ॉल्ट विधि के साथ:UISearchBar जब उपयोगकर्ता रोक प्रकार और पता लगाने के तुरंत खोज नहीं है इसलिए ठहराव

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 

मैं तुरंत जब पता लगा सकते हैं टेक्स्ट बदलता है और यूआरएल का आचरण करता है, लेकिन इस तरह, टेक्स्ट टाइप धीमा है क्योंकि आईफोन यूआरएल खोज रहा है, इसलिए जब मैं कुछ सेकेंड के लिए लिखना बंद कर देता हूं तो मैं यूआरएल की लांचिंग शुरू करना चाहता हूं, इसलिए मैं चाहता हूं url द्वारा जानकारी को पुनर्प्राप्त करने के लिए तालिका दृश्य को रीफ्रेश करने के लिए टाइपिंग के विराम का पता लगाएं। मैं इस अनुरोध की एक पुराने पोस्ट पाया है और मैं एक समाधान है कि के लिए मुझे काम नहीं करते की कोशिश की है:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(request:)  object:searchText]; 

    //..... 

    [self performSelector:@selector(request:) withObject:searchText afterDelay:1.5]; 
} 

-(void)request:(NSString *)myString 
{ 
    NSLog(@"%@",myString); 
} 

इस तरह से जब मैं अनुरोध विधि टाइप कर रहा हूँ नहीं कहा है, लेकिन यह है जब मैं लिखना बंद कर मेरे द्वारा टाइप किए जाने वाले प्रत्येक चरित्र के लिए बुलाया जाता है, तो डिफ़ॉल्ट विधि के समान है, मुझे कुछ गलत है? या कार्यान्वयन सही नहीं है?

उत्तर

24

ऐसा लगता है कि प्रदान की समाधान की तरह है क्योंकि करने के लिए "searchText" तर्क काम नहीं कर रहा cancelPreviousPerformRequestsWithTarget:selector:object: पिछले कॉल पर "searchText" तर्क से मेल नहीं खाता performSelector:withObject:afterDelay: पर; इसलिए देरी की खोज प्रत्येक पाठ परिवर्तन को कतारबद्ध करती है, और कभी रद्द नहीं होती है।

आप अपनी खोज के आविष्कार में देरी के लिए NSTimer का उपयोग कर सकते हैं, और टेक्स्ट बदलते समय टाइमर को रद्द कर सकते हैं: अपनी ऑब्जेक्ट को NSTimer संपत्ति या फ़ील्ड दें; searchBar:textDidChange: में कोई मौजूदा टाइमर रद्द करें, फिर नया बनाएं और शेड्यूल करें। टाइमर का लक्ष्य आपकी खोज विधि को कॉल करना चाहिए।

कुछ की तरह (मेरे सिर के ऊपर से):

// in your class' .h object fields 
{ 
    ... 
    NSTimer *searchDelayer; // this will be a weak ref, but adding "[searchDelayer invalidate], searchDelayer=nil;" to dealloc wouldn't hurt 
    ... 
} 

// in the .m 

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    [searchDelayer invalidate], searchDelayer=nil; 
    if (YES /* ...or whatever validity test you want to apply */) 
    searchDelayer = [NSTimer scheduledTimerWithTimeInterval:1.5 
                target:self 
                selector:@selector(doDelayedSearch:) 
                userInfo:searchText 
                repeats:NO]; 
} 

-(void)doDelayedSearch:(NSTimer *)t 
{ 
    assert(t == searchDelayer); 
    [self request:searchDelayer.userInfo]; 
    searchDelayer = nil; // important because the timer is about to release and dealloc itself 
} 

कुछ प्रोग्रामर कमजोर संदर्भ से मैं यहाँ कर रहा हूँ के बारे में कम स्वाभाविक हो सकता है।

[जोड़ने के लिए संपादित:]

यहाँ कैसे आप यह कर सकता है यदि आप cancelPreviousPerformRequestsWithTarget के प्रयोग पर निर्धारित किया गया है ...:

// in your class' .h object fields 
{ 
    ... 
    NSString *priorSearchText; // this will NOT be a weak ref, so adding "[priorSearchText release]" to dealloc is also required 
    ... 
} 

// in the .m 
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self 
              selector:@selector(request:) 
              object:priorSearchText]; 
    [priorSearchText release], priorSearchText = [searchText retain]; 
    if (YES /* ...or whatever validity test you want to apply */) 
    [self performSelector:@selector(request:) 
       withObject:searchText 
       afterDelay:1.5]; 
} 

मुझे नहीं लगता कि मैं कभी भी उपयोग किया है रद्द करेंप्रिफॉर्मफॉर्मफॉर्म WithTarget: ... असली के लिए, इसलिए मुझे नहीं पता कि यह किसी भी आश्चर्य को छुपाता है या नहीं। यदि आपको परेशानी है, तो NSLogs जोड़ें, देरी की गई खोजों को रद्द करने के लिए देखें जब उन्हें चाहिए।

+0

आप पहले विकल्प को कैसे कार्यान्वित करते हैं NSString? क्या आप कृपया एक कोड उदाहरण लिख सकते हैं? – Piero

+0

ठीक है, मैं कुछ लिखूंगा। हालांकि त्रुटि-मुक्त काम करने की गारंटी नहीं है, क्योंकि मैंने वास्तविक कोड में इस दृष्टिकोण की कोशिश नहीं की है। – rgeorge

+0

यह लाइन क्या कर रही है? [स्वयं अनुरोध: searchDelayer.userInfo]; ? –

0

ले जाएँ इस लाइन: [self performSelector:@selector(request:) withObject:searchText afterDelay:1.5]; अपने textDidChange विधि से बाहर और पाठ में रख संपादन विधि शुरू किया: - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar

+0

लेकिन यदि मैं इस विधि में उस पंक्ति को जोड़ता हूं: - (शून्य) खोजबर्टटेक्स्टडिडबीजिंग संपादन: (यूआईएसआईआरबीएआर *) खोज यहां पर खोज नहीं है पाठ तर्क, मैं इसे कैसे कर सकता हूं ... – Piero