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

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

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

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

#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
93 голоса | спросил noobsmcgoobs 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 12 Sep 2013 08:31:49 +0400 2013, 08:31:49

20 ответов


0

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

Еще один способ отклонить клавиатуру:

[self.view endEditing:YES];

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

ответил Nitin Gohel 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 12 Sep 2013 08:55:16 +0400 2013, 08:55:16
0

Добавьте метод делегата 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;
}
ответил iPatel 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 12 Sep 2013 08:35:10 +0400 2013, 08:35:10
0

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

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}
ответил Vijay Dokrimare 5 AM000000110000003531 2014, 11:56:35
0

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

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)
ответил Chathuranga Silva 10 22015vEurope/Moscow11bEurope/MoscowTue, 10 Nov 2015 08:16:45 +0300 2015, 08:16:45
0

SWIFT 4:

self.view.endEditing(true)

или

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

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

    textField.resignFirstResponder()

    return true

}

Objective-C:

[self.view endEditing:YES];

или

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

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

    return YES;
}
ответил Sam 16 Jam1000000amTue, 16 Jan 2018 08:15:00 +030018 2018, 08:15:00
0

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

[textField resignFirstResponder];

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

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;
}
ответил Zen 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 12 Sep 2013 08:45:50 +0400 2013, 08:45:50
0

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

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

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

ответил DKong 4 J0000006Europe/Moscow 2015, 13:09:32
0

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

В 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];
}
ответил Takide 7 Jpm1000000pmWed, 07 Jan 2015 22:21:34 +030015 2015, 22:21:34
0

Для группы из UITextView внутри 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];
    }
}
ответил Matias Elorriaga 1 +04002014-10-01T05:16:08+04:00312014bEurope/MoscowWed, 01 Oct 2014 05:16:08 +0400 2014, 05:16:08
0

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

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

ответил zainoz.zaini 21 52014vEurope/Moscow11bEurope/MoscowFri, 21 Nov 2014 02:06:06 +0300 2014, 02:06:06
0

Поскольку в тегах указано только iOS, я опубликую ответ для Swift 1.2 и iO 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 (представление).

ответил Juan Boero 6 PM00000070000000531 2015, 19:18:05
0

В 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)
        }
    }
ответил Rob-4608 13 WedEurope/Moscow2017-12-13T19:49:45+03:00Europe/Moscow12bEurope/MoscowWed, 13 Dec 2017 19:49:45 +0300 2017, 19:49:45
0

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

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

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

ответил Jitendra 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 12 Sep 2013 08:36:17 +0400 2013, 08:36:17
0

Итак, вот что я сделал, чтобы он отклонился после прикосновения к фону или возврата. Мне пришлось добавить делегат = 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
ответил noobsmcgoobs 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 13 Sep 2013 01:23:39 +0400 2013, 01:23:39
0

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

@interface ViewController : UIViewController <UITextFieldDelegate>

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

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

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
ответил Ravi_Parmar 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 12 Sep 2013 08:53:50 +0400 2013, 08:53:50
0
- (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];
ответил Harshad 21 J000000Tuesday15 2015, 10:55:53
0

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)
}
ответил Mojtabye 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 14 Sep 2015 10:35:19 +0300 2015, 10:35:19
0

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

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)
ответил coldfire 1 J0000006Europe/Moscow 2016, 13:50:21
0

для быстрых 3-4 я исправил как

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

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

ответил hall.keskin 13 WedEurope/Moscow2017-12-13T14:18:41+03:00Europe/Moscow12bEurope/MoscowWed, 13 Dec 2017 14:18:41 +0300 2017, 14:18:41
0

Просто используйте это в Objective-C, чтобы закрыть клавиатуру:

[[UIApplication sharedApplication].keyWindow endEditing:YES];
ответил Linc 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 28 Sep 2018 05:25:21 +0300 2018, 05:25:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132