it-swarm.com.ru

Как программно отклонить клавиатуру iOS при нажатии return

Я создал UITextField программно, сделав UITextField свойством viewController. Мне нужно распустить клавиатуру с возвратом и касанием на экране. Я был в состоянии получить сенсорный экран, чтобы уволить, но нажатие возврата не работает. 

Я видел, как это сделать с раскадровками и путем непосредственного выделения и инициализации объекта UITextField, не создавая его как свойство. Можно сделать?

.час

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    _username.delegate = self; 

    [self.view addSubview:self.username];
    [_username resignFirstResponder];

}

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

@end
94
noobsmcgoobs

Простой способ - подключить делегат UITextField к себе (self.mytestField.delegate = self) и отключить клавиатуру в методе textFieldShouldReturn, используя [textField resignFirstResponder]; 

Другой способ отклонить клавиатуру заключается в следующем:

[self.view endEditing:YES];

Поместите [self.view endEditing:YES]; туда, где вы хотите закрыть клавиатуру (событие кнопки, событие касания и т.д.).

241
Nitin Gohel

Добавьте метод делегата UITextField следующим образом:

@interface MyController : UIViewController <UITextFieldDelegate>

И установите свой textField.delegate = self;, а затем добавьте два метода делегата UITextField 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
29
iPatel

// Скрыть клавиатуру, касаясь фона в поле зрения

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}
23
Vijay Dokrimare

просто используйте это в Swift, чтобы отклонить клавиатуру:

UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)

Swift 3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)
19
Chathuranga Silva

Swift 4:

self.view.endEditing(true)

или же

Установите делегат текстового поля для текущего viewcontroller и затем:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}

Цель-C:

[self.view endEditing:YES];

или же

Установите делегат текстового поля для текущего viewcontroller и затем:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];

    return YES;
}
8
Sam

Вот что я использую в своем коде. Отлично работает!

В yourviewcontroller.h добавьте:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Теперь в .m файле добавьте это к вашей функции ViewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];

    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

Также добавьте эту функцию в файл .m:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
6
Takide

В App Delegate вы можете написать

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

таким образом, вы не можете писать слишком много кода.

6
DKong

Попытайтесь получить представление о том, что является первым респондентом в иерархии представления iOS. Когда ваше текстовое поле становится активным (или первым респондентом), когда вы прикасаетесь к нему (или передаете ему сообщение becomeFirstResponder программно), оно представляет клавиатуру. Таким образом, чтобы удалить текстовое поле от первого респондента, вы должны передать ему сообщение resignFirstResponder.

[textField resignFirstResponder];

И чтобы скрыть клавиатуру на ее кнопке возврата, вы должны реализовать ее метод делегата textFieldShouldReturn: и передать сообщение resignFirstResponder.

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;
}
6
Zen

Для группы UITextViews внутри ViewController:

Swift 3.0

for view in view.subviews {
    if view is UITextField {
        view.resignFirstResponder()
    }
}

Objective-C

// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        // no need to cast
        [view resignFirstResponder];
    }
}
3
Matias Elorriaga

Чтобы закрыть клавиатуру после ее появления, есть 2 случая,

  1. когда UITextField находится в внутри UIScrollView 

  2. когда UITextField находится вне UIScrollView 

2. когда UITextField находится вне UIScrollView Переопределяет метод в вашем подклассе UIViewController

вы также должны добавить делегата для всех UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. В представлении scroll нажатие снаружи не вызовет событие, поэтому в этом случае используйте Распознаватель жестов касания, Перетащите UITapGesture для представления прокрутки и создать IBAction для него.

чтобы создать IBAction, нажмите Ctrl + щелкните UITapGesture и перетащите его в .h файл viewcontroller. 

Здесь я назвал tappedEvent в качестве имени моего действия

- (IBAction)tappedEvent:(id)sender {
      [self.view endEditing:YES];  }

приведенная выше информация была получена по следующей ссылке, пожалуйста, обратитесь за дополнительной информацией или свяжитесь со мной, если вы не понимаете данные выше.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

3
user4993619

IN Swift 3

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

ИЛИ ЖЕ

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }
2
Rob-4608

Я знаю, что на это ответили другие, но я нашел еще одну статью, в которой также не упоминалось ни одно фоновое событие - просмотр таблицы или прокрутки.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

2
zainoz.zaini

Поскольку теги говорят только iOS, я опубликую ответ для Swift 1.2 и iOs 8.4, добавьте их в свой класс Swift контроллера представления:

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    self.view.endEditing(true)

}

// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {

    textField.resignFirstResponder()

    return true
}
// MARK: -

Также не забудьте добавить UITextFieldDelegate в объявление класса и установить для ваших текстовых полей делегата self (представление).

2
Juan Boero

Итак, вот что я сделал, чтобы заставить его отклониться после прикосновения к фону или возврата. Я должен был добавить делегат = self в viewDidLoad, а затем также методы делегата позже в файлах .m. 

.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>


@property (strong, atomic) UITextField *username;

@end

.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    self.username.delegate = self;
    [self.username resignFirstResponder];
    [self.view addSubview:self.username];


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    return YES;
}



- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

@end
1
noobsmcgoobs

Сначала вам нужно добавить текстовое поле deletegete в .h файл. если не объявлять (BOOL)textFieldShouldReturn:(UITextField *)textField этот метод не вызывается. поэтому сначала добавьте делегат и напишите код скрытия клавиатуры в этот метод.

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

попробуй это..

1
Jitendra
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

когда вы используете более одного текстового поля на экране С этим методом вам не нужно упоминать текстовое поле каждый раз, как 

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];
0
Harshad

Добавить делегата: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

а затем добавить этот метод делегата

// Это должно работать отлично

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
0
Ravi_Parmar

Swift 2:

это то, что сделано, чтобы сделать все!

закройте клавиатуру с помощью кнопки Done или Touch outSide, Next для перехода к следующему вводу.

Сначала измените TextFiled Return Key на Next в StoryBoard.

override func viewDidLoad() {
  txtBillIdentifier.delegate = self
  txtBillIdentifier.tag = 1
  txtPayIdentifier.delegate  = self
  txtPayIdentifier.tag  = 2

  let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
  self.view.addGestureRecognizer(tap)

}

func textFieldShouldReturn(textField: UITextField) -> Bool {
   if(textField.returnKeyType == UIReturnKeyType.Default) {
       if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
           next.becomeFirstResponder()
           return false
       }
   }
   textField.resignFirstResponder()
   return false
}

func onTouchGesture(){
    self.view.endEditing(true)
}
0
Mojtabye

Если вы не знаете текущий контроллер представления или текстовое представление, вы можете использовать цепочку ответчика: 

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)
0
coldfire

Просто используйте это в Objective-C для отклонения клавиатуры:

[[UIApplication sharedApplication].keyWindow endEditing:YES];
0
Linc

для Swift 3-4 я исправлен как 

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

просто скопируйте вставить в любом месте класса. Это решение просто работает, если вы хотите, чтобы все UItextfield работали одинаково, или если у вас есть только один!

0
hall.keskin