UITableView की पृष्ठभूमि को छूकर कीबोर्ड को खारिज करें


105

मैं एक है UITableViewके साथ UITextFieldकोशिकाओं के रूप में है। मैं कीबोर्ड को खारिज करना चाहता हूं जब पृष्ठभूमि की पृष्ठभूमि UITableViewको छुआ जाता है। मैं ऐसा करने की कोशिश कर रहा हूं, UIButtonइसका आकार बनाकर UITableViewऔर इसे पीछे रखकर UITableView। एकमात्र समस्या यह UIButtonहै कि UITableView पर टच होने पर भी सभी टच को पकड़ रहा है। मैं क्या गलत कर रहा हूं?

धन्यवाद!


संबंधित प्रश्न और उत्तर: Q1 , Q2 , Q3
यान्टो झी

यह सबसे अच्छा उत्तर है stackoverflow.com/a/12851794/1418457
onmyway133

जवाबों:


203

यह आसानी से एक UITapGestureRecognizer ऑब्जेक्ट बनाकर किया जाता है (डिफ़ॉल्ट रूप से यह एक टैप पर "जेस्चर" का पता लगाएगा ताकि आगे कोई अनुकूलन की आवश्यकता न हो), जब इशारे को निकाल दिया जाता है, तब लक्ष्य / कार्रवाई निर्दिष्ट करता है और फिर जेस्चर पहचानकर्ता को संलग्न करता है आपके टेबल दृश्य के लिए।

जैसे शायद आपके viewDidLoadतरीके में:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];

और hideKeyboardविधि इस तरह दिख सकती है:

- (void) hideKeyboard {
    [textField1 resignFirstResponder];
    [textField2 resignFirstResponder];
    ...
    ...
}

ध्यान दें कि किसी UITextFieldवस्तु के अंदर छूने पर हावभाव को निकाल नहीं दिया जाता है । हालांकि इसे UITableViewबैकग्राउंड, फूटर व्यू, हेडर व्यू और UILabelsइनसाइड सेल्स आदि पर निकाल दिया जाता है ।


4
जब मैंने यह कोशिश की तो मैंने पाया कि यह टेबल को कोशिकाओं के चयन से रोकता है :( बहुत बढ़िया समाधान अन्यथा
ब्रायन

109
एक सॉल्यूशन बेलो बताते हैं कि आप इस काम को सेटिंग से बहुत बेहतर बना सकते हैं:gestureRecognizer.cancelsTouchesInView = NO;
ज़ेब्स

3
और टेबल व्यू से जुड़ी होने के बाद जेस्चर रिकॉगनाइजर को जारी करना न भूलें।
पॉल लिंच

39
के लिए hideKeyboardविधि, बजाय पाठ क्षेत्रों के साथ सीधे संवाद स्थापित करने आप कर सकते हैं [self.view endEditing:NO];। Apple डॉक्स से: " यह विधि पाठ क्षेत्र के लिए वर्तमान दृश्य और उसके सबव्यू पदानुक्रम को देखती है जो वर्तमान में पहला उत्तरदाता है। यदि यह एक मिल जाए, तो यह उस पाठ क्षेत्र को पहले उत्तरदाता के रूप में इस्तीफा देने के लिए कहता है। यदि बल पैरामीटर सेट है। हाँ, पाठ क्षेत्र भी कभी नहीं पूछा गया है, यह इस्तीफा देने के लिए मजबूर किया जाता है। "
गोबोट

1
इस तरह से मेरे "didSelectRowAtIndexPath" विधि का उपयोग नहीं किया जा रहा है। इसके लिए कोई उपाय ??
अनिरुद्ध

127

यदि आप सेट करते हैं तो UITapGestureRecognizer समाधान तालिका सेल चयन के साथ काम करता है:

gestureRecognizer.cancelsTouchesInView = NO;

1
यह सेल को छूने की अनुमति देता है, लेकिन इशारा के रूप में अच्छी तरह से पहचाना जाता है, शायद हमें इस प्रतिनिधि विधियों को लागू करना चाहिएshouldReceiveTouch
onmyway133

61

यहाँ यह करने का एक सबसे अच्छा तरीका है। बस यह करो

[self.view endEditing:YES];

या

[[self.tableView superView] endEditing:YES];

मुझे यह कोड कहां रखना चाहिए? क्षमा करें, मैं शुरुआती हूं। और कृपया स्विफ्ट कोड प्रदान करें।
जॉन

54

आप इसे स्टोरीबोर्ड से भी कर सकते हैं: यहां छवि विवरण दर्ज करें


1
जो कुछ भी मैं चुनता हूं: ड्रैग पर खारिज करें, इंटरमीस को खारिज करें, जब मैं टेबल सेल को छूता हूं, तो उसका चयन किया जाता है। मैं Xcode 8 का उपयोग कर रहा हूं, स्विफ्ट 3. कृपया मदद करें
जॉन

22

जैसा UITableViewकि एक उपवर्ग है UIScrollView, नीचे एक प्रतिनिधि विधि को लागू करना एक अत्यंत आसान, त्वरित समाधान प्रदान करता है। यहां तक ​​कि resignFirstResponderपदानुक्रम के आत्मनिरीक्षण को देखने और वर्तमान उत्तरदाता को खोजने के लिए इसमें शामिल होने की आवश्यकता नहीं है और इसे उत्तरदाता की स्थिति से इस्तीफा देने के लिए कहता है।

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}

और UIScrollViewDelegateहेडर फ़ाइल में जोड़ना याद रखें ।


2
यदि आप iOS7 और इसके बाद के संस्करण को लक्षित कर रहे हैं, तो @Joe Masilotti द्वारा इस एक लाइनर के माध्यम से यह किया जा सकता है: self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
atulkhatri

यदि आप स्क्रीन के तल पर एक टेक्स्टफील्ड पर टैप करते हैं जो कीबोर्ड को दिखाने के लिए स्क्रॉल करने वाला है तो क्या होता है? - आपका कीबोर्ड छिपा होगा।
इस्लाम Q.

स्विफ्ट 4 - self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
रॉबलैब्स

13

सबसे पहले, जोड़कर scrollViewWillBeginDraggingअपने लिए सुनो :UIViewControllerUIScrollViewDelegate

.H फ़ाइल में:

@interface MyViewController : UIViewController <UIScrollViewDelegate> 

.M फ़ाइल में:

- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {

    [self dismissKeyboard];

}

तो अन्य बातचीत के लिए सुनो:

- (void)setupKeyboardDismissTaps {

    UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeUpGestureRecognizer.cancelsTouchesInView = NO;
    swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
    [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];

    UISwipeGestureRecognizer *swipeDownGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeDownGestureRecognizer.cancelsTouchesInView = NO;
    swipeDownGestureRecognizer.direction = UISwipeGestureRecognizerDirectionDown;
    [self.tableView addGestureRecognizer:swipeDownGestureRecognizer];

    UISwipeGestureRecognizer *swipeLeftGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeLeftGestureRecognizer.cancelsTouchesInView = NO;
    swipeLeftGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.tableView addGestureRecognizer:swipeLeftGestureRecognizer];

    UISwipeGestureRecognizer *swipeRightGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeRightGestureRecognizer.cancelsTouchesInView = NO;
    swipeRightGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.tableView addGestureRecognizer:swipeRightGestureRecognizer];


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

}

फिर लागू करें dismissKeyboard:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    [yourTextFieldPointer resignFirstResponder];

}

और अगर, मेरी तरह, आप एक कस्टम तालिका सेल के अंदर एक UITextField के लिए कीबोर्ड को खारिज करना चाहते थे:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    CustomCellClass *customCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    [customCell.textFieldInCell resignFirstResponder]; 

}

उम्मीद है कि किसी को भी खोजने में मदद करता है !!



8

यहां आपके कोडिंग आनंद के लिए तेज़ संस्करण है:

यह एक नल इशारा पहचानकर्ता जोड़ता है फिर कीबोर्ड को खारिज कर देता है। TextField के लिए कोई आउटलेट आवश्यक नहीं है!

override func viewDidLoad() {
    super.viewDidLoad()
    view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}

func handleTap(sender: UITapGestureRecognizer) {
    if sender.state == .Ended {
        view.endEditing(true)
    }
    sender.cancelsTouchesInView = false
}

1
यह एक कस्टम टेबल व्यूसेल के साथ भी काम करता है! मैंने इसे जानने में बहुत समय बिताया है। आपको बहुत - बहुत धन्यवाद! आप मेरे हीरो हैं। youtu.be/EqWRaAF6_WY
peacetype

8

कोशिकाओं पर नल को अवरुद्ध किए बिना स्विफ्ट 3 संस्करण है।

में viewDidLoad()विधि:

let dismissKeyboardGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
dismissKeyboardGesture.cancelsTouchesInView = false
tableView.addGestureRecognizer(dismissKeyboardGesture)

और hideKeyboardइस तरह दिखता है:

func hideKeyboard() {
    view.endEditing(true)
}

7

मैंने इसे इस तरह किया:

पहले उत्तरदाता को निष्क्रिय करने के लिए अपने TableViewController में एक विधि बनाएं (जो उस बिंदु पर आपका टेक्स्टबॉक्स होगा)

- (BOOL)findAndResignFirstResonder:(UIView *)stView {
    if (stView.isFirstResponder) {
        [stView resignFirstResponder];
        return YES;     
    }

    for (UIView *subView in stView.subviews) {
        if ([self findAndResignFirstResonder:subView]) {
            return YES;
        }
    }
    return NO;
}

में tableView:didSelectRowAtIndexPath:पिछले विधि कॉल:

- (void)tableView:(UITableView *)tableView
                             didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    [self findAndResignFirstResonder: self.view];
    ...
}

आप इसे गलत कर रहे हैं जिस तरह से आप पूछ रहे हैं। आप कीबोर्ड को हटाने के लिए दृश्य को बताए गए दृश्य पर एक बटन नहीं

2
यह खूबसूरती से काम करता है यदि आप एक टेबल व्यू सेल के भीतर टैप करते हैं (और उस टेबल व्यू सेल के भीतर किसी भी यूआईटीएक्सफ़िल्ड के बाहर)। हालांकि, अगर मैं टेबल व्यू की पृष्ठभूमि पर टैप करता हूं (जो कि अक्सर पाने के लिए एक आसान लक्ष्य है - याट फेट्स लॉ!), ऐसी कोई किस्मत नहीं। सही है, यह अपेक्षित है, क्योंकि हम इस ऑपरेशन को tableView के भीतर कर रहे हैं: didSelectRowAtIndexPath:। अगर यह किसी भी तरह से तालिका दृश्य में कहीं और दोहन के साथ काम करने के लिए समायोजित किया जा सकता है (जो अन्यथा कीबोर्ड फ़ोकस नहीं चाहेगा), मुझे लगता है कि हमें यहां एक विजेता मिल गया है!
जो

मुझे jandandrea जैसी ही समस्या है। यही कारण है कि didSelectRowAtIndexPathआग अगर आप tableview ही नल नहीं करता है।
ज़ेकेल

अगर dideelectRowAtIndexPath पर्याप्त नहीं है, तो टचबेगन में भी ऐसा ही करें!
अमोघ तलपलीकर

5

मेरे पास एक UITableViewControllerकार्यान्‍वयन touchesBegan:withEvent:था और मेरे लिए काम नहीं किया।

यहाँ काम किया है:

स्विफ्ट:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    view.endEditing(true)
}

उद्देश्य सी:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.view endEditing:YES];
}

अच्छा विचार है, मुझे यह पसंद है।
HotFudgeSunday

4
@interface DismissableUITableView : UITableView {
}
@end

@implementation DismissableUITableView

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 [self.superview endEditing:YES];
 [super touchesBegan:touches withEvent:event];
}

@end

फिर सुनिश्चित करें कि आपकी Nib फाइल में आप अपने UITableView के प्रकार को DismissableUITableView पर सेट करें ..... हो सकता है कि मैं इस वर्ग के लिए बेहतर नाम के बारे में सोच सकता था, लेकिन आपको यह बात समझ आ गई।


4

यदि आप iOS7 को लक्षित कर रहे हैं, तो आप निम्न में से किसी एक का उपयोग कर सकते हैं:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

जब टेबल दृश्य स्क्रॉल किया जाएगा और बाद में स्टॉक मैसेजेस ऐप की तरह कीबोर्ड को छिपा दिया जाएगा, तो पूर्व में कीबोर्ड ऑफ़ स्क्रीन को चेतन करेगा।

ध्यान दें कि ये से हैं UIScrollView, जो से UITableViewविरासत में मिला है।


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

3

इसे इस्तेमाल करे:

viewDidLoad(){

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))

    tableView.addGestureRecognizer(tap)

}
//Calls this function when the tap is recognized.
@objc func dismissKeyboard() {

    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)

}

2

UITableView UIScrollView का एक उपवर्ग है।

जिस तरह से मैंने किया वह उपयोगकर्ता द्वारा एक स्क्रॉल घटना के लिए सुनना था और फिर इस्तीफा दे दिया। यहां आपके कोड को लागू करने के लिए UIScrollViewDelegate विधि है;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

जब मैं इस तरह की समस्याओं का सामना कर रहा हूं, तो सबसे अच्छा तरीका यह है कि प्रत्येक ऑब्जेक्ट के लिए प्रतिनिधि प्रोटोकॉल और पैरेंट क्लासेस (इस मामले में UITableViewDelegate, UIScrollViewDelegate) पर शोध किया जाए। एनएस की वस्तुओं की संख्या काफी बड़ी और व्यापक है। एक प्रोटोकॉल को लागू करना भी आसान है, फिर किसी भी चीज़ को उपवर्गित करना।


2

मेरे पास एक ही समस्या थी और यहां मेरा समाधान है, यह मेरे लिए पूरी तरह से काम करता है:

आपके द्वारा कार्यान्वित दृश्य या दृश्य नियंत्रक में <UITextFieldDelegate>

(मेरे मामले में मेरे पास UITableViewCellTextFieldCell नामक एक कस्टम है ),

UITapGestureRecognizerसंपत्ति के रूप में घोषित करें :

@interface TextFieldCell : UITableViewCell <UITextFieldDelegate>
{
    UITextField *theTextField;
    UITapGestureRecognizer *gestureRecognizer;
}
@property (nonatomic,retain) UITextField *theTextField;
@property (nonatomic,retain) UITapGestureRecognizer *gestureRecognizer; 

और इसे अपने दृश्य / नियंत्रक में प्रारंभ करें:

self.gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard:)];

इस - (void)textFieldDidBeginEditing:(UITextField *)textFieldविधि में, superViewअपने टेबल-व्यू तक जाने और कॉल करने के लिए उपयोग करें addGestureRecognizer:

[self.superview.superview addGestureRecognizer:gestureRecognizer];

और में - (void)textFieldDidEndEditing:(UITextField *)textField, बस इशारा पहचानने वाले को हटा दें:

[self.superview.superview removeGestureRecognizer:gestureRecognizer];

आशा करता हूँ की ये काम करेगा।


यह मेरे लिए किया। धन्यवाद hajjack
gilsaints88

2

मैं चाहता था कि मेरी सेल कीबोर्ड को खोले जब सेल का कोई हिस्सा चुना गया था और इसे बंद कर दें अगर आप सेल से कहीं भी क्लिक करते हैं। कीबोर्ड खोलने के लिए:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    if (selected)
    {
        [self.textField becomeFirstResponder];
    }
}

(नोट: मैंने सेल को उप-वर्गित किया है लेकिन आप इसे आसानी से tableView:didSelectRowAtIndexPath:प्रतिनिधि विधि में प्राप्त कर सकते हैं UITableView)

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

समाधान यह जांचने के लिए है कि क्या वर्तमान में चयनित सेल के अंदर क्लिक हुआ है:

- (void)viewDidLoad
{
    [super viewDidLoad];
    //gesture recognizer to close the keyboard when user taps away
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard:)];
    tap.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tap];
}

-(void)dismissKeyboard:(UIGestureRecognizer*)tapGestureRecognizer
{
    if (!CGRectContainsPoint([self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]].frame, [tapGestureRecognizer locationInView:self.tableView]))
    {
        [self.view endEditing:YES];
    }
}

2

मुझे एक समाधान मिला है जो बहुत अच्छा काम करता है।

UIGestureRecognizerDelegate और विधि - gestureRecognizer: shouldReceiveTouch: का उपयोग करने की आवश्यकता है ।

जेस्चर आइडेंटिफ़ायर को तालिका दृश्य में निम्नानुसार जोड़ें:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
tapGestureRecognizer.cancelsTouchesInView = NO;
tapGestureRecognizer.delegate = self;
[self.suggestedTableView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];

फिर, UITableViewCell वर्ग में किए गए स्पर्शों को अस्वीकार करने के लिए shouldRceiveTouch प्रतिनिधि विधि को लागू करें । HideKeyboard जब स्पर्श UITableViewCell वर्ग बाहर प्रदर्शन किया गया है विधि केवल बुलाया जाएगा।

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if([touch.view isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    // UITableViewCellContentView => UITableViewCell
    if([touch.view.superview isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    // UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell
    if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    return YES; // handle the touch
}

- (void) hideKeyboard{
    [textField resignFirstResponder];
}

2

UITableViewएक आसान backgroundViewसंपत्ति है, जिसके साथ मैंने सेल चयन के साथ खिलवाड़ किए बिना यह व्यवहार हासिल किया, जैसा कि स्विफ्ट में नीचे दिखाया गया है:

let tableBackTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
tableView.backgroundView = UIView()
tableView.backgroundView?.addGestureRecognizer(tableBackTapRecognizer)

1

मैं समाधान खोज रहा था और मुझे ऐसा कुछ भी नहीं मिला जो मेरे कोड में फिट हो, इसलिए मैंने इसे इस तरह किया:

http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap

यह मूल रूप से पहले बताए गए दृष्टिकोणों का एक संयोजन है, लेकिन किसी भी चीज़ को उप-वर्ग करने या पृष्ठभूमि बटन बनाने की आवश्यकता नहीं है।


1

बस एक UITapGestureRecognizer का उपयोग कर रहा है और cancelsTouchesInView = NOइसका मतलब है कि कोशिकाओं पर टैप और UITextViews भी छिपाने को ट्रिगर करते हैं। यदि आपके पास कई UITextViews हैं और आप अगले एक पर टैप करते हैं तो यह बुरा है। कीबोर्ड छिपाना शुरू कर देगा और फिर अगला टेक्स्ट व्यू फर्स्टResponder हो जाएगा और कीबोर्ड फिर से दिखाई देने लगेगा। इससे बचने के लिए, टैप लोकेशन की जाँच करें और यदि कीबोर्ड किसी सेल पर नहीं है, तो केवल कीबोर्ड छिपाएँ:

// init
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapTableView:)];
tapRecognizer.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:tapRecognizer];


// Hide on tap
- (void)didTapTableView:(UITapGestureRecognizer *)tap
{
    CGPoint point = [tap locationInView:tap.view];
    [self.view endEditing:!CGRectContainsPoint([self.tableView rectForRowAtIndexPath:[self.tableView indexPathForRowAtPoint:point]], point)];
}

के लिए आदेश में scrollViewWillBeginDragging:शुरू किया जा करने के लिए, tableView की scrollEnabledसंपत्ति होना चाहिएYES

// Hide on scroll
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}

मेरे लिए सही है। टेबलव्यू सेल में एक टेक्सबॉक्स जोड़ा गया; अगर मैं कीबोर्ड से बाहर को छूता हूं
निकॉला

0

आप टेक्स्टफ़िल्ड से भरी तालिका क्यों बनाना चाहते हैं? आपको पाठ फ़ील्ड वाले प्रत्येक पंक्ति के लिए एक विस्तृत दृश्य का उपयोग करना चाहिए। जब आप अपने विस्तृत विवरण को आगे बढ़ाते हैं, तो सुनिश्चित करें कि आप "[myTextField getFirstResponder]" को कॉल करते हैं, ताकि उपयोगकर्ता तालिका सूची से सिर्फ एक क्लिक दूर संपादन शुरू कर सके।


Apple का कॉन्टैक्ट ऐप ठीक यही करता है। मैं यह नहीं कहूंगा कि यह प्रति पाठ फ़ील्ड से भरा है, लेकिन यह उन्हें अच्छे प्रभाव के लिए उपयोग करता है।
जो

2
एक टेबलव्यू में टेक्स्ट इनलाइन को संपादित करना बहुत तेज और अधिक सहज है जो उपयोगकर्ता द्वारा संपादित किए जाने वाले प्रत्येक टेक्स्ट फ़ील्ड के लिए विस्तार से विचार करने से अधिक है ... बस अपने निकटतम HTML फॉर्म या टेक्स्ट फ़ील्ड को iPhone प्राथमिकताएं पैन या संपर्क ऐप में पूछें, या आदि आदि ... यह एक वास्तविक शर्म की बात है कि Apple ने इसे एक मानक सेल प्रकार नहीं बनाया है, लेकिन इसे प्राप्त करने के बारे में वेब पर बहुत अधिक जानकारी है।
ग्लेन

0

यदि आप अपने टेबल व्यू को उपवर्ग (यूजी!) के लिए तैयार कर रहे हैं, तो कुछ इस तरह काम कर सकता है:

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

   BOOL backgroundTouched = YES;

   for (UITouch *touch in touches) {
      CGPoint location = [touch locationInView:self];
      for (UITableViewCell *cell in self.visibleCells) {
         if (CGRectContainsPoint(cell.frame, location)) {
            backgroundTouched = NO;
            break;
         }
      }
   }

   if (backgroundTouched) {
      for (UITableViewCell *cell in self.visibleCells) {
         // This presumes the first subview is the text field you want to resign.
         [[cell.contentView.subviews objectAtIndex:0] resignFirstResponder];
      }
   }

   [super touchesBegan:touches withEvent:event];
}

0

यदि आप वापसी कुंजी दबाते समय कीबोर्ड को खारिज करना चाहते हैं, तो आप बस निम्नलिखित कोड को जोड़ सकते हैं TextField में वापसी विधि होनी चाहिए:

- (BOOL)textFieldShouldReturn:(UITextField *)atextField
{
   [textField resignFirstresponder];
}

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

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard)];

    [self.view addGestureRecognizer:tap];

अब बस चयनकर्ता विधि में इस्तीफा उत्तरदाता जोड़ें:

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

आशा है कि यह मदद करता है, धन्यवाद :)


0

कई दिलचस्प जवाब। मैं उस समाधान में विभिन्न दृष्टिकोणों को संकलित करना चाहता हूं जो मैंने सोचा था कि एक यूआईटेबल व्यू परिदृश्य (यह वह है जिसे मैं आमतौर पर उपयोग करता हूं) को फिट करता हूं: हम जो आमतौर पर चाहते हैं वह मूल रूप से कीबोर्ड को दो परिदृश्यों पर छिपाना है: पाठ यूआई तत्वों के बाहर टैप करने पर, या UITableView नीचे / ऊपर स्क्रॉल करने पर। पहला परिदृश्य हम आसानी से एक TapGestureRecognizer के माध्यम से जोड़ सकते हैं, और दूसरा UIScrollViewDelegate ScrollViewWillBeginDragging: विधि के माध्यम से। व्यापार का पहला क्रम, कीबोर्ड को छिपाने की विधि:

   /**
     *  Shortcut for resigning all responders and pull-back the keyboard
     */
    -(void)hideKeyboard
    {
        //this convenience method on UITableView sends a nested message to all subviews, and they resign responders if they have hold of the keyboard
        [self.tableView endEditing:YES];

    }

यह विधि UITableView व्यू पदानुक्रम के भीतर किसी भी टेक्स्टफीड UI को सब-यूआई से इस्तीफा देती है, इसलिए यह स्वतंत्र रूप से हर एक तत्व को इस्तीफा देने की तुलना में अधिक व्यावहारिक है।

इसके बाद, हम एक बाहरी टैप इशारे के माध्यम से खारिज करने का ख्याल रखते हैं:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self setupKeyboardDismissGestures];

}

- (void)setupKeyboardDismissGestures
{

//    Example for a swipe gesture recognizer. it was not set-up since we use scrollViewDelegate for dissmin-on-swiping, but it could be useful to keep in mind for views that do not inherit from UIScrollView
//    UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
//    swipeUpGestureRecognizer.cancelsTouchesInView = NO;
//    swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
//    [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];

    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    //this prevents the gestureRecognizer to override other Taps, such as Cell Selection
    tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tapGestureRecognizer];

}

TapGestureRecognizer.cancelsTouchesInView को NO पर सेट करना है। GureureRecognizer को UITableView के सामान्य आंतरिक कामकाज (उदाहरण के लिए, सेल चयन में हस्तक्षेप नहीं करने) से ओवरराइड करने से रोकना है।

अंत में, यूआईटेबल व्यू को ऊपर / नीचे स्क्रॉल करने पर कीबोर्ड को छिपाने के लिए, हमें UIScrollViewDelegate प्रोटोकॉल स्क्रॉल व्यूविलबिनग्रैगिंग: विधि: के रूप में लागू करना चाहिए।

.h फ़ाइल

@interface MyViewController : UIViewController <UIScrollViewDelegate>

.m फ़ाइल

#pragma mark - UIScrollViewDelegate

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self hideKeyboard];
}

मुझे उम्मीद है यह मदद करेगा! =)


0

यहां बताया गया है कि मैंने आखिरकार कैसे काम किया। मैंने विभिन्न उत्तरों से सुझाव और कोड संयुक्त किए। विशेषताएं: संपादन करते हुए कीबोर्ड को ऊपर फेंकना, "अगला" और "पूर्ण" कीबोर्ड वापसी प्रकार सेट करते समय कीबोर्ड के ऊपर पाठ फ़ील्ड।

static const CGFloat ANIMATION_DURATION = 0.4;
static const CGFloat LITTLE_SPACE = 5;
CGFloat animatedDistance;
CGSize keyboardSize;

@interface ViewController () <UITextFieldDelegate>
 @property (weak, nonatomic) IBOutlet UITextField *firstNameTXT;
  .....// some other text fields
 @property (weak, nonatomic) IBOutlet UITextField *emailTXT;
@end

@implementation ViewController
- (void)viewDidLoad{
.....
// add tap gesture to help in dismissing keyboard
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(tapScreen:)];// outside textfields

[self.view addGestureRecognizer:tapGesture];

// set text fields return key type to Next, last text field to Done
[self.firstNameTXT setReturnKeyType:UIReturnKeyNext];
.....
[self.emailTXT setReturnKeyType:UIReturnKeyDone];

// set text fields tags
[self.firstNameTXT setTag:0];
....// more text fields
[self.emailTXT setTag:5];

// add keyboard notification
[[NSNotificationCenter defaultCenter] addObserver:self     selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
}
[[NSNotificationCenter defaultCenter] addObserver:self      selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}

// dismiss keyboard when tap outside text fields
- (IBAction)tapScreen:(UITapGestureRecognizer *)sender {
  if([self.firstNameTXT isFirstResponder])[self.firstNameTXT resignFirstResponder];
  ...
  if([self.emailTXT isFirstResponder])[self.emailTXT  resignFirstResponder];

  }
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
   if(textField.returnKeyType==UIReturnKeyNext) {
     // find the text field with next tag
     UIView *next = [[textField superview] viewWithTag:textField.tag+1];
     [next becomeFirstResponder];
   } else if (textField.returnKeyType==UIReturnKeyDone || textField.returnKeyType==UIReturnKeyDefault) {
    [textField resignFirstResponder];
 }
return YES;
}

// Moving current text field above keyboard
-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField{
   CGRect viewFrame = self.view.frame;
   CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
   CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];
   CGFloat textFieldBottomLine = textFieldRect.origin.y + textFieldRect.size.height + LITTLE_SPACE;//

   CGFloat keyboardHeight = keyboardSize.height;

   BOOL isTextFieldHidden = textFieldBottomLine > (viewRect.size.height - keyboardHeight)? TRUE :FALSE;
  if (isTextFieldHidden) {
    animatedDistance = textFieldBottomLine - (viewRect.size.height - keyboardHeight) ;
    viewFrame.origin.y -= animatedDistance;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
  }
  return YES;
}

-(void) restoreViewFrameOrigionYToZero{
  CGRect viewFrame = self.view.frame;
  if (viewFrame.origin.y != 0) {
    viewFrame.origin.y = 0;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
  }
}

-(void)keyboardDidShow:(NSNotification*)aNotification{
   NSDictionary* info = [aNotification userInfo];
   keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
 }

-(void)keyboardDidHide:(NSNotification*)aNotification{
   [self restoreViewFrameOrigionYToZero];// keyboard is dismissed, restore frame view to its  zero origin
}
@end

0

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

- (BOOL)findAndResignFirstResponder {
if (self.isFirstResponder) {
    [self resignFirstResponder];
    return YES;
}

    for (UIView *subView in self.subviews) {
        if ([subView findAndResignFirstResponder]) {
            return YES;
        }
    }
    return NO;
}

और आप इस विधि को अपने उपयोगिता वर्ग में भी रख सकते हैं और @ जेस्सा के उत्तर जैसे नल के इशारे से उपयोग कर सकते हैं।


0

स्विफ्ट 4 / 4.2 / 5

आप सेल को टैप करने पर कीबोर्ड को खारिज भी कर सकते हैं - कुछ और करने से पहले।

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    view.endEditing(true)
    // Do something here
    }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.