2012-06-19 18 views
10

मैं एक दृश्य पदानुक्रम है किUIView की 'खाली जगह "

UIScrollView 
| 
+- UIView 
    | 
    +- UITextField 
    +- UITextField 
    +- UIButton 

क्या मैं चाहता हूँ उपयोगकर्ता जो पाठ क्षेत्रों में से एक का उपयोग किया है के लिए और करने के लिए कीबोर्ड को स्क्रीन पर देखता है की तरह लग रहा है पर नल का पता लगाने कीबोर्ड छुपाने के लिए UIView के "खाली स्थान" पर टैप करने में सक्षम हो। तो, मैं नहीं चाहिए, उदाहरण के लिए, UIView करने के लिए बुलबुला अप करने के लिए UIButton से एक घटना (है कि अगर मैं UIView करने के लिए UITapGestureRecognizer जोड़ने वास्तव में क्या होता है)।

मैं वांछित कार्यशीलता कैसे प्राप्त कर सकते हैं?

- (void) dismissKeyboard{ 
    [YOURFIELDHERE resignFirstResponder]; 
} 

तुम भी ऐसा बटन अभी भी क्लिक करने योग्य हैं और नहीं करने के लिए इस जोड़ने की जरूरत:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
gestureRecognizer.cancelsTouchesInView = NO; 
[self.view addGestureRecognizer:gestureRecognizer]; 

फिर dismissKeyboard पद्धति जोड़ें:

उत्तर

22

अपने viewDidLoad विधि में इस कदम पहचानकर्ता जोड़ने इशारा पहचानकर्ता द्वारा ओवरराइड:

gestureRecognizer.delegate = self; // in viewDidLoad 
<UIGestureRecognizerDelegate> //in your header file 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

    if ([touch.view isKindOfClass:[UIButton class]]){ 
    return NO; 
    } 
    return YES; // handle the touch 
} 
+0

जेस्चर रिकॉग्नाइज़र का प्रतिनिधि ऐसा कुछ है जिसका मैं उपयोग नहीं कर रहा हूं। इसके बजाय मैं छूता कार्रवाई करने के लिए मूर्खतापूर्ण उपवर्गीकरण इस्तेमाल किया, यह इतना अधिक आसान किया जा सकता था। धन्यवाद। – Eugene

+0

मुझे लगता है कि गलती एक बार से अधिक कर दिया है। पहिया का पुन: आविष्कार किया, और उस पर बहुत सुंदरता से नहीं, केवल यह पता लगाने के लिए कि एक प्रतिनिधि विधि थी जो मैंने पूरा करने में कामयाब होने से भी बेहतर किया था। यह मेरी राय में ऐप्पल के दस्तावेज का वास्तविक पतन है। –

+0

महान जवाब! आपका बहुत बहुत धन्यवाद! – HiveHicks

1

मुझे एक ही समस्या का सामना करना पड़ता है और इसे एक निष्पक्ष समाधान के साथ हल करता है।

  1. UIView के उदाहरण से UICiew के उदाहरण से दृश्य को बदलें ताकि यह स्पर्श ईवेंट को संभाल सके।
  2. देखें नियंत्रक कि स्पर्श घटना संभालती में एक IBAction विधि बनाएँ। इस मामले में, हम दृश्य के सबव्यू से किसी भी पहले उत्तरदाता को इस्तीफा दे देंगे।

    - (IBAction)backgroundTapped:(id)sender { [contentView endEditing:YES]; }

    contentView देखें सिर्फ उदाहरण चर की ओर इशारा करते है। आप इसे जो कुछ भी चाहते हैं उसका नाम दे सकते हैं। जब आप देखें संदेश endEditing पारित कर दिया, यह अनिवार्य रूप से अपने subviews बताता पहले प्रत्युत्तर इस्तीफा देने के लिए, इस प्रकार कुंजीपटल को आउट किया।

  3. लक्ष्य (देखें) और एक्शन इंटरफ़ेस बिल्डर के माध्यम से (आपने अभी बनाया IBAction विधि) से कनेक्ट करें, देखें की connection inspector खोलने के द्वारा, Touch Up Inside का चयन करके उसे फ़ाइल के मालिक वस्तु पर खींचें, तो विधि के नाम का चयन ।

उम्मीद है कि यह मदद करता है।

1

मैं जानता हूँ कि यह एक छोटे देर हो चुकी है, लेकिन एक त्वरित, सरल समाधान निम्नलिखित है:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

    [self.view endEditing:YES]; 
} 

यह अगर आप किसी भी खाली जगह पर नल कहा जाता हो जाता है।

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