2011-08-15 12 views
15

मैं निम्नलिखित UISearchbar कोड है:UISearchBar/UITextField के लिए इनपुट में विराम का पता लगाने के लिए कैसे?

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    NSString* endpoint =[NSString stringWithFormat:@"http://www.someurl/", 
         [searchText stringByReplacingOccurrencesOfString:@" " withString:@"+"]]; 
    NSURL* url = [NSURL URLWithString:endpoint]; 
    NSURLRequest* request = [NSURLRequest requestWithURL:url]; 
    GTMHTTPFetcher* myFetcher = [GTMHTTPFetcher fetcherWithRequest:request]; 
    [myFetcher beginFetchWithDelegate:self didFinishSelector:@selector(searchResultsFetcher:finishedWithData:error:)]; 
} 

मैं इनपुट में एक विराम के बाद इस अनुरोध को भेजने और टाइमर हर एक चरित्र मारा जाता है रीसेट करना चाहते हैं। मैं यह कैसे कर सकता हूँ?

उत्तर

52

टाइपिंग जारी रखने के लिए उपयोगकर्ता को नियंत्रण वापस देता है, तो उसे एनएसटीमर का उपयोग करने की आवश्यकता नहीं है।

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

      //..... 

      [self performSelector:@selector(request) withObject:nil afterDelay:yourpausetime]; 

     } 
+2

एनएसटीमर की तुलना में अधिक सुरुचिपूर्ण समाधान, मुझे लगता है।रनलोप और उपयोगकर्ता इनपुट या अनुरोध के आधार पर समस्याएं हो सकती हैं, शायद? हम्म, अब टाइमर की तुलना में नहीं, हालांकि – RSully

+0

अच्छा! यहां विस्तृत टिप्पणियों के साथ एक और उदाहरण दिया गया है: http://benedictcohen.co.uk/blog/archives/157 – ma11hew28

+0

काम नहीं कर रहा है, चयनकर्ता बार-बार कॉल करता है भले ही हम रद्द कर रहे हों (स्विफ्ट 3) – Saif

-1

अपनी खोज में टेक्स्ट टेक्स्ट इनपुट करें और एक एनएसटीमर कॉलर को चयन करें। किसी प्रकार का संकेतक दिखाएं ताकि उपयोगकर्ता को नहीं लगता कि कुछ गलत हो रहा है। जब चयनकर्ता आग

[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(targetMethod:) userInfo:nil repeats:NO]; 
+0

एनएसटीमीटर का एक समूह उपयोगकर्ता प्रकार के रूप में बंद हो जाएगा। जब कोई अक्षर टाइप किया जाता है तो मैं एनएसटीमर को कैसे रीसेट कर सकता हूं? –

+0

मैं इसे वापस लेता हूं। केवल तभी अमान्य करें जब आप टाइमर को फायरिंग से रोकना चाहते हैं। उपरोक्त नमूना दोहराया गया है: नहीं, तो यह एक बार आग लग जाएगा और यह हो गया है। = –

+0

मुझे बिल्कुल यकीन नहीं है कि टाइमर पूरा होने तक टेक्स्ट इनपुट को कैसे अवरुद्ध करना है? क्या आप मुझे एक उदाहरण दिखाने में सक्षम होंगे? –

6

textDidChange विधि एक NSTimer बनाने में, 2 सेकंड के लायक कहते हैं। यदि टाइमर पहले से मौजूद है, तो टाइमर को अमान्य और पुन: बनाएँ। (Untested कोड :)

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if (myTimer) { 
     if ([myTimer isValid]) { [myTimer invalidate]; } 
     [myTimer release], myTimer = nil; 
    } 
    myTimer = [[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(userPaused:) userInfo:nil repeats:NO] retain]; 
} 

उपयोगकर्ता 2 सेकंड के लिए टाइपिंग बंद हो जाता है जब, -userPaused: बुलाया जाएगा और अपने टाइमर स्वचालित रूप से अवैध हो जाएगा (हालांकि नहीं के बराबर नहीं)। जब उपयोगकर्ता फिर से टाइप करना शुरू करता है तो एक नया टाइमर सेटअप किया जाएगा।

+0

एक आकर्षण की तरह काम करता है! – Wirsing

0

उत्कृष्ट कोड और मेरे लिए सही काम कर रहा है। मैंने इसे Replacing an NSTimer with performSelector:withObject:afterDelay पाया। बेन समाधान के लिए धन्यवाद ... सब इनाम उसे को मैं सिर्फ इसे यहाँ कॉपी आसान

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    //because the view can be unloaded we must store all data so that its state can be restored in viewDidLoad 
    self.searchQuery = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    SEL fetchSearchResults = @selector(fetchSearchResults); 

    //cancel the previous search request 
    [[self class] cancelPreviousPerformRequestsWithTarget:self selector:fetchSearchResults object:nil];  

    //perform the search in a seconds time. If the user enters addition data then this search will be cancelled by the previous line 
    [self performSelector:fetchSearchResults withObject:nil afterDelay:1]; 

    return YES; 
} 

- (void)fetchSearchResults 
{ 
    NSLog(@"performing search %@", self.searchQuery); 
    ... 
} 
1

मैं स्विफ्ट में अपने मौजूदा कोड को स्वेन टैन के जवाब अनुकूलन करने में सक्षम था पाया जा सकता है। मेरे मामले में, मैं एक विधि को स्ट्रिंग भेज रहा हूं जो खोज परिणामों async लोड करता है। इसके अतिरिक्त, मैं UISearchBar का उपयोग नहीं कर रहा हूं बल्कि एक सादा पुराना UITextField का उपयोग नहीं कर रहा हूं।

func sendSearchRequest(text: String?) { 
    // Call async search method here... 
} 

तरीका है कि cancelPreviousPerformRequestsWithTarget काम करता है आप एक ही लक्ष्य, चयनकर्ता उत्तीर्ण करने की आवश्यकता है, और उद्देश्य यह है कि performSelector कॉल में क्रम में पारित किया गया था:

var currentTempQuery = "" 

... 

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    if let t = textField.text { 
     let s: NSString = t 
     let newString = s.stringByReplacingCharactersInRange(range, withString: string).trim() 

     NSObject.cancelPreviousPerformRequestsWithTarget(self, selector:#selector(MyViewController.sendSearchRequest(_:)), object: currentTermQuery) 

     // Don't replace currentTermQuery until after the cancelPreviousPerformRequestWithTarget call 
     currentTermQuery = newString 
     performSelector(#selector(MyViewController.sendSearchRequest(_:)), withObject: newString, afterDelay: 1) 
    } 
    return true 
} 

यहाँ चयनकर्ता जाता है कि कहा जा रहा है पिछले अनुरोध को रद्द करने के लिए। मेरे कार्यान्वयन में, चूंकि मैं केवल एक स्ट्रिंग पास कर रहा हूं, इसलिए मुझे कॉल के बीच वर्तमान अनुरोध स्ट्रिंग को संरक्षित करने की आवश्यकता है ताकि मैं अनुरोध रद्द करने के लिए इसका संदर्भ दे सकूं।

परिणाम मेरे यूआईटीएक्स्टफाल्ड में अक्षरों को टाइप करने और हटाने के लिए काम करता है। केवल एक खोज प्रति प्रमुख खोज शब्द परिवर्तन भेजा जाता है।

जैसा कि मैंने कहा, जैसा कि स्वेन टैन ने पोस्ट किया लेकिन थोड़ा अलग उपयोग किया। उम्मीद है कि यह कुछ लोगों को मदद करता है।

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