मैं सोच रहा हूं कि जब उपयोगकर्ता एक के बाहर छूता है तो कीबोर्ड को कैसे गायब किया जाए UITextField
।
मैं सोच रहा हूं कि जब उपयोगकर्ता एक के बाहर छूता है तो कीबोर्ड को कैसे गायब किया जाए UITextField
।
जवाबों:
आपको इसे जोड़ने UITapGestureRecogniser
और इसे देखने के लिए असाइन करने की आवश्यकता होगी , और इसके बाद UITextField
चयनकर्ता पर पहले उत्तरदाता को इस्तीफा दें।
कोड:
ViewDidLoad में
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
बर्खास्तगी में:
-(void)dismissKeyboard
{
[aTextField resignFirstResponder];
}
( aTextField
टेक्स्टफील्ड कहाँ है जो कीबोर्ड के लिए ज़िम्मेदार है)
स्विफ्ट 3 संस्करण जैसा दिखता है
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)
बर्खास्तगी के लिए
func dismissKeyboard (_ sender: UITapGestureRecognizer) {
aTextField.resignFirstResponder()
}
[aTextField resignFirstResponder]
होगा कि [self.view endEditing:YES];
इसे टेक्स्ट फील्ड के संदर्भ की जरूरत नहीं होगी और यह कई
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
प्रति @qiaoyi उत्तर जोड़ा ; मेरे पास एक तालिका थी जिसमें पंक्ति चयन का जवाब नहीं था। 5 साल बाद, मुझे उम्मीद है कि यह किसी और की मदद करता है।
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
मैंने कुछ जवाब दिए।
एक आइवर का उपयोग करें, जिसके दौरान आरंभीकृत हो जाता है viewDidLoad:
UIGestureRecognizer *tapper;
- (void)viewDidLoad
{
[super viewDidLoad];
tapper = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapper];
}
वर्तमान में जो संपादन हो रहा है उसे खारिज करें:
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
इसे जांचें, यह ऐसा करने का सबसे आसान तरीका होगा,
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];// this will do the trick
}
या
यह लाइब्रेरी स्क्रोलबार ऑटो स्क्रॉलिंग, कीबोर्ड को छिपाने के लिए टैप स्पेस, आदि सहित संभाल लेगी ...
मैं देख रहा हूं कि कुछ लोग UITapGestureRecognizer
विधि का उपयोग करके समस्या कर रहे हैं । सबसे आसान तरीका है कि मैंने अभी भी अपने मौजूदा बटन के नल व्यवहार को बरकरार रखते हुए इस कार्यक्षमता को पूरा किया है, @ Jensen2k के उत्तर में केवल एक पंक्ति जोड़ रहा है:
[tap setCancelsTouchesInView:NO];
इसने मेरे मौजूदा बटन को @Dmitry Sitnikov की विधि का उपयोग किए बिना अभी भी काम करने की अनुमति दी।
इसके बारे में property
यहां पढ़ें (खोज करें CancelsTouchesInView
): UIGestureRecognizer वर्ग संदर्भ
मुझे यकीन नहीं है कि यह स्क्रॉलबार के साथ कैसे काम करेगा, जैसा कि मैंने देखा कि कुछ मुद्दों के साथ था, लेकिन उम्मीद है कि कोई अन्य व्यक्ति उसी परिदृश्य में चला सकता है जो उसके पास था।
UIImageView
, जोड़ें [imageView setUserInteractionEnabled:NO];
और आप इसे "क्लिक करें", जो इस विधि को काम करते हैं।
अपने UIView
इंस्ट्रूमेंट को UIControl
(इंटरफ़ेस बिल्डर में) बनाना बेहतर है और फिर उनके TouchUpInside
इवेंट को dismissKeyboard
मेथड से कनेक्ट करें । इस IBAction
विधि की तरह दिखेगा:
- (IBAction)dismissKeyboard:(id)sender {
[aTextBox resignFirstResponder];
}
UITapGestureRecognizer
दृश्य के अंदर बटन पर टैपिंग के साथ हस्तक्षेप किया गया)। touchesEnded
काम नहीं किया क्योंकि UIScrollView
स्विफ्ट 4
UIViewController
इस एक्सटेंशन विधि के साथ अपना सेटअप एक बार उदाहरण के लिए viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
self.setupHideKeyboardOnTap()
}
और कीबोर्ड को टैप करके भी खारिज कर दिया जाएगा NavigationBar
।
import UIKit
extension UIViewController {
/// Call this once to dismiss open keyboards by tapping anywhere in the view controller
func setupHideKeyboardOnTap() {
self.view.addGestureRecognizer(self.endEditingRecognizer())
self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer())
}
/// Dismisses the keyboard from self.view
private func endEditingRecognizer() -> UIGestureRecognizer {
let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:)))
tap.cancelsTouchesInView = false
return tap
}
}
स्विफ्ट संस्करण, यह अन्य तत्वों के साथ संयोजन में काम करता है (जैसे UIButton
या किसी अन्य UITextField
):
override func viewDidLoad() {
super.viewDidLoad()
let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
tapper.cancelsTouchesInView = false
view.addGestureRecognizer(tapper)
}
self
बजाय होना चाहिएself.view
canclesTouchesInView
उपयोग करने के लिए एक उपयोगी संपत्ति है। धन्यवाद।
c#
। FYI करें कि अर्धविराम वाक्यविन्यास-अनुमत है, यह सिर्फ आवश्यक नहीं है।
इसके बारे में कैसे: मुझे पता है कि यह एक पुरानी पोस्ट है। यह किसी की मदद कर सकता है :)
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSArray *subviews = [self.view subviews];
for (id objects in subviews) {
if ([objects isKindOfClass:[UITextField class]]) {
UITextField *theTextField = objects;
if ([objects isFirstResponder]) {
[theTextField resignFirstResponder];
}
}
}
}
यह एक अच्छा सामान्य समाधान है:
उद्देश्य सी:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
स्विफ्ट:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
@Icodebuster समाधान के आधार पर: https://stackoverflow.com/a/18756253/417652
स्विफ्ट 4 ऑनलाइनर
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
मुझे लगता है कि ऐसा करने का सबसे आसान (और सबसे अच्छा) तरीका यह है hitTest:withEvent
कि किसी भी स्पर्श को सुनने के लिए अपने वैश्विक दृष्टिकोण और उपयोग विधि को उपवर्गित करें। कीबोर्ड पर टच पंजीकृत नहीं है, इसलिए हिटटेस्ट: विथवेंट तभी कहा जाता है जब आप टच / स्क्रॉल / स्वाइप / पिंच ... कहीं और कॉल करते हैं [self endEditing:YES]
।
यदि आप दृश्य के शीर्ष पर एक बटन पर क्लिक करते हैं तो कॉल नहीं किया जाता है touchesBegan
क्योंकि यह उपयोग करने से बेहतर है touchesBegan
। यह बेहतर है UITapGestureRecognizer
कि उदाहरण के लिए एक स्क्रॉल इशारा को पहचान नहीं सकता है। यह एक मंद स्क्रीन का उपयोग करने से भी बेहतर है क्योंकि एक जटिल और गतिशील उपयोगकर्ता इंटरफ़ेस में, आप हर जगह मंद स्क्रीन नहीं डाल सकते हैं। इसके अलावा, यह अन्य कार्यों को अवरुद्ध नहीं करता है, आपको बाहर बटन का चयन करने के लिए दो बार टैप करने की आवश्यकता नहीं है (जैसे के मामले मेंUIPopover
)।
इसके अलावा, यह कॉल करने से बेहतर है [textField resignFirstResponder]
, क्योंकि आपके पास स्क्रीन पर कई टेक्स्ट फ़ील्ड हो सकते हैं, इसलिए यह उन सभी के लिए काम करता है।
बाहर से छूकर अपने कीबोर्ड को छिपाने का यह सबसे आसान तरीका होना चाहिए:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
( जब उपयोगकर्ता टेक्स्टफील्ड के बाहर अन्य क्षेत्र को टैप करता है तो कीबोर्ड को कैसे खारिज किया जाए? )
यदि दृश्य को एक बार में एम्बेड किया जाता है UIScrollView
तो आप निम्नलिखित का उपयोग कर सकते हैं:
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
जब टेबल दृश्य स्क्रॉल किया जाएगा और बाद में स्टॉक मैसेजेस ऐप की तरह कीबोर्ड को छिपा दिया जाएगा, तो पूर्व में कीबोर्ड ऑफ़ स्क्रीन को चेतन करेगा।
ध्यान दें कि ये iOS 7.0 या इसके बाद के संस्करण पर उपलब्ध हैं।
आप XCode 6 और इसके बाद के संस्करण में स्टोरीबोर्ड का उपयोग कर सकते हैं:
अपने ViewController द्वारा उपयोग की जाने वाली कक्षा की हेडर फ़ाइल में इसे जोड़ें:
@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>
- (IBAction)dissmissKeyboardOnTap:(id)sender;
@end
फिर इसे उसी ViewController की कार्यान्वयन फ़ाइल में जोड़ें:
- (IBAction)dissmissKeyboardOnTap:(id)sender{
[[self view]endEditing:YES];
}
यह अब आपके स्टोरीबोर्ड दृश्य (यानी ViewController) के लिए 'प्राप्त कृत्यों' में से एक होगा:
अब आपको इस कार्य को कीबोर्ड से स्पर्श करने के उपयोगकर्ता के इशारे पर हुक करने की आवश्यकता है।
महत्वपूर्ण - आपको अपने स्टोरीबोर्ड में शामिल 'UIView' को UIControl में बदलने की आवश्यकता है , ताकि यह ईवेंट प्राप्त कर सके। अपने दृश्य नियंत्रक दृश्य पदानुक्रम से दृश्य का चयन करें:
... और उसकी कक्षा बदलें:
अब अपने दृश्य के 'खाली' भाग पर, अपने दृश्य के 'खाली' भाग (वास्तव में आप 'प्राप्त कार्रवाई' को UIControl पर खींच रहे हैं) के बगल में स्थित छोटे वृत्त से खींचें। आपको उन घटनाओं का चयन दिखाया जाएगा, जिन पर आप अपनी कार्रवाई शुरू कर सकते हैं:
Inside टच अप इनसाइड ’विकल्प चुनें। आपने अब कीबोर्ड से स्पर्श करने की एक उपयोगकर्ता कार्रवाई के लिए आपके द्वारा बनाए गए IBAction को झुका दिया है। जब उपयोगकर्ता कीबोर्ड से टैप करता है, तो यह अब छिपाया जाएगा।
(नोट: ईवेंट को कार्रवाई को हुक करने के लिए, आप प्राप्त कार्रवाई से सीधे अपने व्यू कंट्रोलर पदानुक्रम में UIControl पर भी खींच सकते हैं। यह पदानुक्रम में 'नियंत्रण' के रूप में प्रदर्शित होता है।)
अगर मुझे आपको सही लगा तो आप कीबोर्ड वाइल टैपिंग को इस्तीफा देना चाहते हैं, textfield
लेकिन आपके पास इसका संदर्भ नहीं हैtextfield
।
इसे इस्तेमाल करे;
reftextField
अब textFieldDidBeginEditing
सेट संदर्भित पाठ क्षेत्र में
- (void) textFieldDidBeginEditing:(UITextField *)textField{
reftextField = textField;
}
अब आप किसी भी बटन घड़ी पर खुशी से उपयोग कर सकते हैं, (शुरू में संपादित संपादन पर पारदर्शी बटन जोड़कर)
- (void)dismissKeyboard {
[reftextField resignFirstResponder];
}
या इस्तीफा दिया बटन के लिए यह प्रयास करें।
//for resigning on done button
- (BOOL) textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
बस यहां सूची में जोड़ने के लिए कि बाहरी स्पर्श पर कीबोर्ड को कैसे खारिज किया जाए।
viewDidLoad:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
कहीं भी:
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
[textFieldName resignFirstResponder];
puts("Dismissed the keyboard");
}
यहाँ बहुत सारे उत्तरों का उपयोग करने के बारे UITapGestureRecognizer
में - जिनमें से सभी UITextField
स्पष्ट (एक्स) बटन को तोड़ते हैं । उपाय यह है कि अपने प्रतिनिधि के माध्यम से हावभाव पहचानकर्ता को दबा दिया जाए:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
BOOL touchViewIsButton = [touch.view isKindOfClass:[UIButton class]];
BOOL touchSuperviewIsTextField = [[touch.view superview] isKindOfClass:[UITextField class]];
return !(touchViewIsButton && touchSuperviewIsTextField);
}
यह सबसे मजबूत समाधान नहीं है, लेकिन यह मेरे लिए काम करता है।
return !touchViewIsButton
:। मुझे लगता है कि किसी भी अन्य बटन को कीबोर्ड को खारिज करने की आवश्यकता है जो उन्हें अपने कार्यों में करना चाहिए। जब कीबोर्ड बर्खास्तगी पर लेआउट बदलता है तो इसके अलावा TouchUpInside को कॉल नहीं किया जा सकता है।
आप UiView के लिए श्रेणी बना सकते हैं और इस तरह से टचबिजेन माइटोड को ओवरराइड कर सकते हैं।
यह मेरे लिए ठीक काम कर रहा है। और इस समस्या का केंद्रीय समाधान है।
#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.window endEditing:true];
[super touchesBegan:touches withEvent:event];
}
@end
@ Jensen2k के उत्तर का स्विफ्ट संस्करण:
let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)
func dismissKeyboard() {
aTextField.resignFirstResponder()
}
एक लाइन
self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))
मैंने अपने नए विकास के लिए बैरी उदाहरण का उपयोग किया। यह बहुत अच्छा काम किया! लेकिन मुझे थोड़े बदलाव को शामिल करना था, केवल टेक्स्टफील्ड को संपादित करने के लिए कीबोर्ड को खारिज करने की आवश्यकता थी।
इसलिए, मैंने निम्नलिखित बैरी का उदाहरण दिया:
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
_textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
_textBeingEdited = nil;
}
इसके अलावा, मैंने छुपायाकेबोर्ड विधि को निम्नानुसार बदल दिया:
- (IBAction)hideKeyboard:(id)sender
{
// Just call resignFirstResponder on all UITextFields and UITextViews in this VC
// Why? Because it works and checking which one was last active gets messy.
//UITextField * tf = (UITextField *) sender;
[_textBeingEdited resignFirstResponder];
}
सबसे आसान और छोटा तरीका है इस कोड को अपने साथ जोड़ना viewDidLoad
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self.view
action:@selector(endEditing:)]];
मैंने यहां कई तरह की प्रतिक्रियाएं कीं और कोई किस्मत नहीं थी। मेरा टैप जेस्चर पहचानकर्ता हमेशा कारण था UIButtons
कि जब मैं टैप करता था तब भी जवाब नहीं देता थाcancelsTouchesInView
इशारे करने वाले के पहचानकर्ता को NO पर ।
यह वही है जो अंततः इस मुद्दे को हल करता है:
एक आइवर है:
UITapGestureRecognizer *_keyboardDismissGestureRecognizer;
जब कोई पाठ फ़ील्ड संपादन शुरू करता है, तो जेस्चर पहचानकर्ता सेट करें:
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
if(_keyboardDismissGestureRecognizer == nil)
{
_keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissKeyboard)] autorelease];
_keyboardDismissGestureRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
}
}
फिर ट्रिक यह है कि आप इस dismissKeyboard
विधि को कैसे सेट करते हैं :
- (void) dismissKeyboard
{
[self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01];
}
- (void) dismissKeyboardSelector
{
[self.view endEditing:YES];
[self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer];
_keyboardDismissGestureRecognizer = nil;
}
मुझे लगता dismissKeyboardSelector
है कि टच हैंडलिंग निष्पादन स्टैक से निष्पादन प्राप्त करने के बारे में बस कुछ है ...
इस उदाहरण में, aTextField केवल UITextField है .... यदि अन्य या UITextView हैं, तो करने के लिए थोड़ा और अधिक है।
// YourViewController.h
// ...
@interface YourViewController : UIViewController /* some subclass of UIViewController */ <UITextFieldDelegate> // <-- add this protocol
// ...
@end
// YourViewController.m
@interface YourViewController ()
@property (nonatomic, strong, readonly) UITapGestureRecognizer *singleTapRecognizer;
@end
// ...
@implementation
@synthesize singleTapRecognizer = _singleTapRecognizer;
// ...
- (void)viewDidLoad
{
[super viewDidLoad];
// your other init code here
[self.view addGestureRecognizer:self.singleTapRecognizer];
{
- (UITapGestureRecognizer *)singleTapRecognizer
{
if (nil == _singleTapRecognizer) {
_singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToDismissKeyboard:)];
_singleTapRecognizer.cancelsTouchesInView = NO; // absolutely required, otherwise "tap" eats events.
}
return _singleTapRecognizer;
}
// Something inside this VC's view was tapped (except the navbar/toolbar)
- (void)singleTapToDismissKeyboard:(UITapGestureRecognizer *)sender
{
NSLog(@"singleTap");
[self hideKeyboard:sender];
}
// When the "Return" key is pressed on the on-screen keyboard, hide the keyboard.
// for protocol UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
NSLog(@"Return pressed");
[self hideKeyboard:textField];
return YES;
}
- (IBAction)hideKeyboard:(id)sender
{
// Just call resignFirstResponder on all UITextFields and UITextViews in this VC
// Why? Because it works and checking which one was last active gets messy.
[aTextField resignFirstResponder];
NSLog(@"keyboard hidden");
}
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleSingleTap:)];
[singleTapGestureRecognizer setNumberOfTapsRequired:1];
[singleTapGestureRecognizer requireGestureRecognizerToFail:singleTapGestureRecognizer];
[self.view addGestureRecognizer:singleTapGestureRecognizer];
}
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
[self.view endEditing:YES];
[textField resignFirstResponder];
[scrollView setContentOffset:CGPointMake(0, -40) animated:YES];
}
इस स्थिति में, स्क्रॉलव्यू का उपयोग किया जा सकता है और स्क्रॉलव्यू में जोड़ा जा सकता है TextField
और मुझे टैप करना है ScrollView
और फिर कीबोर्ड को डिसमिस करना है। मैंने केवल मामले में नमूना कोड बनाने की कोशिश की। ऐशे ही,
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:)))
view.addGestureRecognizer(tapGesture)
// Do any additional setup after loading the view, typically from a nib.
}
func tap(gesture: UITapGestureRecognizer) {
textField.resignFirstResponder()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
आपका स्टोरीबोर्ड उस जस्ट लाइक को देखें।
आप UITextField के बाहर क्लिक करके कीबोर्ड को खारिज करने के लिए UITapGestureRecongnizer पद्धति का उपयोग कर सकते हैं। इस विधि का उपयोग करके जब भी उपयोगकर्ता UITextField के बाहर क्लिक करेगा तो कीबोर्ड खारिज हो जाएगा। नीचे इसका उपयोग करने के लिए कोड स्निपेट है।
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissk)];
[self.view addGestureRecognizer:tap];
//Method
- (void) dismissk
{
[abctextfield resignFirstResponder];
[deftextfield resignFirstResponder];
}