2013-08-16 7 views
5

में टाइप करते समय मामूली देरी के बाद कार्रवाई करें किसी को उम्मीद है कि इस पर कुछ प्रकाश डाला जा सकता है।UITextField

मैं एक कंपनी के लिए एक ऐप पर काम कर रहा हूं और उनके पास एक खोज क्षेत्र है जो कस्टम यूआईटीएक्स्टफाल्ड है। वर्तमान में यह दर्ज प्रत्येक पत्र के साथ खोज को परिशोधित करता है।

समस्या: उनके पास एक छोटा पॉपअप है जो यह दर्शाता है कि यह खोज रहा है और प्रत्येक कीप्रेस के साथ, आप इसे स्क्रीन पर चालू और बंद करते देखते हैं। वे स्पष्ट रूप से यह नहीं चाहते हैं।

मैं क्या करने की सोच रहा था हालांकि यह सुनिश्चित नहीं है कि, प्रत्येक कुंजीपटल पर खोज को परिशोधित करने के बजाय, टाइपिंग समाप्त होने पर खोज करने के बजाय कैसे। लेकिन, मैं भी "खोज" बटन जोड़ना नहीं चाहता हूं। मैं बस उन्हें टाइपिंग, एक सेकंड, देरी या कुछ खत्म करना चाहता हूं, खोज होती है।

क्या उपयोगकर्ता ने टाइपिंग समाप्त करने का पता लगाने का कोई तरीका है? क्या किसी ने ऐसा किया है?

अग्रिम धन्यवाद।

+0

संभावित डुप्लिकेट [? कैसे UISearchBar/UITextField के लिए इनपुट में एक विराम पता लगाने के लिए] (http://stackoverflow.com/questions/7061377/how-to-detect -a-pause-in-input-for-uisearchbar-uitextfield) – Cristik

उत्तर

7

आप शायद इसे एक साधारण एनएसटीमर के साथ कर सकते हैं। shouldChangeCharactersInRange: में जांचें कि क्या टाइमर मान्य है और यदि यह है, तो इसे अमान्य करें, फिर टाइमर को पुनरारंभ करें। जब समय अंततः आग लगने के लिए जोरदार होता है, तो इसका मतलब है कि उपयोगकर्ता ने उस समय के अंतराल में कुछ भी टाइप नहीं किया है जिसे आपने निर्दिष्ट किया था।

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    if (someTimer.isValid) { 
     [someTimer invalidate]; 
    } 
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO]; 

    return YES; 
} 

रूप @Jai Govindani आदेश इस पद्धति को लागू करने में बताया, तो आप अपने UITextField की की प्रतिनिधि के रूप में अपने नियंत्रक निर्दिष्ट करेंगे और सुनिश्चित करें कि आपके नियंत्रक UITextFieldDelegate प्रोटोकॉल के अनुरूप बनाने की आवश्यकता होगी।

+0

स्वयं को UITextField के प्रतिनिधि के रूप में सेट करना न भूलें, निश्चित रूप से –

+0

यह समझ में आता है और यह एक अच्छी शुरुआत है लेकिन मुझे एक दुर्घटना हो रही है। शायद प्रारंभिक मुद्दे के कारण? मैं मैदान में पहला अक्षर टाइप करता हूं, कुछ भी नहीं होता है (देरी के बाद भी)। मैदान में एक दूसरा अक्षर टाइप करें, दुर्घटना! EXC_BAD_ACCESS त्रुटि। मुझे लगता है कि मैं यहाँ करीब हूँ। – r0ddy

+0

@ r0ddy यह कहना मुश्किल है कि समस्या क्या है, लेकिन एक बार जब आप सब कुछ सही ढंग से पंक्तिबद्ध हो जाते हैं, तो इस दृष्टिकोण को काम करना चाहिए जैसा आप चाहते हैं। –

0

आप UITextField प्रतिनिधि विधि

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
+0

यह प्रत्येक अद्यतन में देरी करेगा क्योंकि उपयोगकर्ता द्वारा टाइपिंग समाप्त होने तक सब कुछ देरी करने का विरोध किया जाता है। –

+0

@ 0x7fffffff ठीक है। यह मेरी गलती है। यह चयनकर्ता को कई बार कॉल करेगा। मैं सहमत हूं कि यह एक गलत जवाब है। – Exploring

5

में निम्नलिखित तरीके

[self performSelector:<your selector> withObject:<object if you want to pass anything> afterDelay:<time delay>]; 

कोशिश कर सकते हैं विधि timerWithTimeInterval के साथ: लक्ष्य: चयनकर्ता: userInfo: दोहराता: आप runloop लिए टाइमर को जोड़ना होगा। मैं इस सवाल का जवाब संपादित करने के लिए इस प्रकार की जरूरत:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    if (someTimer.isValid) { 
     [someTimer invalidate]; 
    } 
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO]; 
    [[NSRunLoop mainRunLoop] addTimer:someTimer forMode:NSDefaultRunLoopMode]; 
    return YES; 
} 
की