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



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



Я видел, как это делается с раскадровки и путем выделения и инициализации 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
648   21  

21 ответов:

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

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

[self.view endEditing:YES];

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

добавить делегат метод 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;
}

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

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

просто используйте это в 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)

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

[textField resignFirstResponder];

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

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

в делегате приложения вы можете написать

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

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

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

В yourviewcontroller.ч добавить:

@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];
}

кроме того, добавьте эту функцию в .файл м:

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

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;
}

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

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

  2. когда UITextField вне UIScrollView

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

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

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

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

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

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

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

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

группы UITextViewвнутри элемента ViewController:

Swift 3.0

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

С

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

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

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

поскольку теги говорят только 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 (представление).

в 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)
        }
    }

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

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

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

Итак, вот что я сделал, чтобы заставить его уволить после прикосновения к фону или вернуться. Мне пришлось добавить delegate = 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

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

@interface ViewController : UIViewController <UITextFieldDelegate>

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

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

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
- (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];

Swift 2:

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

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

Первое Изменение TextFiled Return Key до Next в раскадровке.

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)
}

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

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

для swift 3-4 я исправил как

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

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

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

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

Comments

    Ничего не найдено.