2009-06-08 15 views
29

मेरे पास एकाधिक टेक्स्ट बॉक्स के साथ एक UIView है। अब मैंने उत्तरदाताओं को टेक्स्ट फ़ील्ड से दूसरे में बदलने के लिए प्रतिनिधियों का उपयोग किया है। इस मामले में जब उपयोगकर्ता अंतिम टेक्स्ट फ़ील्ड पर आता है तो मेरा कुंजी बोर्ड चला जाता है।उपयोगकर्ता को छूने पर कीबोर्ड छुपाएं

लेकिन जब उपयोगकर्ता UIView को छूता है तो मैं अपने कुंजी बोर्ड को छिपाना चाहता हूं (टेक्स्ट बॉक्स से अलग स्क्रीन पर कहीं भी छूता है)। क्या कोई इस में मेरी मदद कर सकता है।

धन्यवाद

उत्तर

43

उपयोग resignFirstResponder touchesBegan में है, इसलिए जैसे:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch * touch = [touches anyObject]; 
    if(touch.phase == UITouchPhaseBegan) { 
     [self.myTextField resignFirstResponder]; 
    } 
} 

आप यदि आप सुनिश्चित जहां ध्यान वर्तमान में स्थित है नहीं कर रहे हैं एक से अधिक लेख खेतों पर इस कॉल करने के लिए आवश्यकता हो सकती है; मैंने उस मामले का परीक्षण नहीं किया है।

myView.userInteractionEnabled = YES; 
+0

लेकिन जहां इस resignFirstResponder कॉल करने के लिए । उपयोगकर्ता को कैसे पता चलेगा UIView ??? – nbojja

+1

मैंने पोस्ट को संपादित किया है जिसमें स्पर्श के भीतर एक उदाहरण शामिल है। – PCheese

+0

हे .. आपकी मदद के लिए धन्यवाद .. यह UIView के साथ अच्छी तरह से काम किया। लेकिन मेरे पास एक और परिदृश्य है जहां मेरे पास UITableView में टेक्स्ट बॉक्स हैं। इस मामले में आपका कोड काम नहीं कर रहा है।मैं आईफोन विकास के लिए बहुत नया हूं, इसलिए कृपया ...... – nbojja

3

Beginning iPhone Development के अनुसार, आप तो यह है कि एक दौर रेक्ट बटन आकर्षित:

साथ ही, इंटरफ़ेस बिल्डर में, आप दृश्य के लिए "उपयोगकर्ता सहभागिता सक्षम" चेकबॉक्स सक्षम करें, या प्रोग्राम के उपयोग की आवश्यकता होगी यह आपके पूरे यूआई को कवर करता है; पूरी स्क्रीन। फिर लेआउट मेनू पर जाएं और पर क्लिक करें पर वापस भेजें। फिर इंस्पेक्टर में, बटन के प्रकार को राउंड रेक्ट से कस्टम से बदलें। अब इस बटन पर ईवेंट के अंदर एक स्पर्श जोड़ें और इसे एक विधि से संलग्न करें जो इसे संभालता है।

[myTextFieldOne resignFirstResponder]; 
[myTextFieldTwo resignFirstResponder]; 

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

मैं वास्तव में आईफोन एसडीके के लिए वास्तव में नया हूं। मुझे नहीं पता कि यह सबसे अच्छा तरीका है, लेकिन यह काम करता है और मैंने उपर्युक्त पुस्तक से यही सीखा है। आशा करता हूँ की ये काम करेगा।

+0

के साथ काम नहीं करता है क्या आप सुनिश्चित हैं कि आपका सुझाव एमवीसी पैटर्न के अनुरूप है? – Malloc

2

धन्यवाद ब्लैंक, मैं यह करने का प्रयास कर रहा था कि यह कैसे करें और मुझे एहसास नहीं हुआ कि मैं पृष्ठभूमि में एक बटन डाल सकता हूं, अच्छी चाल! यहाँ मेरी योगदान है (इस साइट के लिए और कोको टच करने के लिए तो यह सबसे मजबूत कोड कभी नहीं हो सकता है नया है, लेकिन यह अब तक काम कर रहा है ...):

मैं अपने UIButton पर touchUpInside घटना से इस विधि कॉल:

-(void)closeKeyboard:(id)sender { 
    UIView *theFirstResponder = [self findFirstResponder]; 
    if (theFirstResponder) { 
     [theFirstResponder resignFirstResponder]; 
    } 
} 

जहां इस पाश firstResponder पाता है:

- (UIView *)findFirstResponder { 
    UIView *firstResponderView = nil; 
    for (UIView *view in [self entryFields]) { 
     if ([view isFirstResponder]) { 
      firstResponderView = view; 
      break; 
     } 
    } 
    return firstResponderView; 
} 

यह एक टैग उन्हें (फिर से करने के लिए आवंटित होने को ध्यान में रखते UITextField नियंत्रण से प्रत्येक पर निर्भर है, था क्या कर सकते हैं इंटरफ़ेस बिल्डर में टी)।

वैसे भी मेरे दो सेंट, हालांकि मैं कुछ बेहतर वापस देना चाहता हूं!

14

मैं

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    if(touch.phase==UITouchPhaseBegan){ 
     //find first response view 
     for (UIView *view in [self.view subviews]) { 
      if ([view isFirstResponder]) { 
       [view resignFirstResponder]; 
       break; 
      } 
     } 
    } 
} 
+0

सरल, संक्षिप्त, और पूरी तरह से सामान्य। बहुत अच्छा! – ryan0

2

तो मैं इस पर कष्टदायी है और मैं इसे समझ से बाहर का उपयोग ..

आपको अन्य बटन या कुछ भी चाहिए नहीं है।

आपको बस इतना करना है कि "फाइल मालिक" का चयन करें, इंस्पेक्टर ड्रैग में अपने टेक्स्ट फ़ील्ड आउटलेट (या जिसे आपने इसे नाम दिया है) से अपने वास्तविक टेक्स्टफील्ड में (जिसे आपने नाम दिया है) से चुनें, यह जो भी इनपुट के अतिरिक्त होगा आप पहले ही वायर्ड हो गए थे।

और बिल्कुल नियंत्रण आउटलेट के अलावा फ़ाइलों मालिक को backgroundtouched ... पहली बात यह है कि हम सभी की कोशिश की

1

परिवर्तन के टैब की पहचान से वर्ग UIControl के लिए कक्षा UIView के माध्यम से (UIView UIControl को निरीक्षक के माध्यम से परिवर्तित) निरीक्षक। इसे जोड़ें:

- (IBAction)tabBackground:(id) sender; 

आपकी .h फ़ाइल में।

अपने .m फ़ाइल को यह करें:

- (IBAction)tabBackgroup:(id) sender { 
    [nameField resignFirstRespnder]; 
    [numberField resignFirstResponder]; 
} 

निरीक्षक से अपने tabBackground कनेक्ट करें, कार्रवाई UIView (जो एक एक UIControl है) करने के लिए खंड प्राप्त हुआ है और आप के लिए तैयार हैं।

25

जब आप कीबोर्ड को छिपाना चाहते हैं तो बस इसे अपने व्यू कंट्रोलर में कॉल करें।

[self.view endEditing:NO];

+1

धन्यवाद आदमी! मेरा दिन बड़ा समय बचाया। :) :) –

3

एक सुपर आसान तरीका यह करने के लिए क्या PCheese कहा पर काम कर रहा है।

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
UITouch * touch = [touches anyObject]; 
if(touch.phase == UITouchPhaseBegan) { 
    [self.view endEditing:YES]; 
} 

}

मैं पहले एक बटन घटना के लिए [self.view endEditing:YES]; करते थे, लेकिन जब पिछले जवाब के साथ संयुक्त यह एक का इलाज काम करता है। बहुत आसान है, और आपको कुछ और करने की ज़रूरत नहीं है - बस इसे अपनी .m फ़ाइल में डालें। साथ ही, यह सभी के साथ काम करता है (कम से कम, जहां तक ​​मैंने देखा है) टेक्स्ट फ़ील्ड्स (UITextField और UITextView के लिए काम करता है)।

मुझे पता है कि ओपी को शायद इसकी आवश्यकता नहीं होगी, लेकिन मैं इसे अन्य समस्याओं के साथ साझा करना चाहता हूं।

1

इस समस्या को हल निम्न विधि उपयोग कर रहा है की सबसे उपयुक्त तरीका:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    if(![touch.view isMemberOfClass:[UITextField class]]) { 
     [touch.view endEditing:YES]; 
    } 
} 

नोट: यह UIScrollView उदाहरणों पर काम नहीं करता।

0

के लिए तेजी से 4,0

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first 
    if touch?.phase == UITouchPhase.began { 
     touch?.view?.endEditing(true) 
    } 
} 
संबंधित मुद्दे