Як програмно відмовити клавіатуру iOS при натисканні клавіші return


105

Я створив UITextFieldпрограмно перетворення UITextFieldвластивості viewController. Мені потрібно відхилити клавіатуру із поверненням та натисканням на екран. Мені вдалося доторкнутися до екрана, щоб відхилити, але натискання повернення не працює.

Я бачив, як це зробити за допомогою розповідей та шляхом виділення та ініціалізації UITextFieldоб'єкта безпосередньо, не створюючи його як властивість. Можливо зробити?

.h

#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

Відповіді:


265

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

Ще один спосіб відхилення клавіатури:

[self.view endEditing:YES];

Помістіть місце, [self.view endEditing:YES];де ви хочете відхилити клавіатуру (подія кнопки, подія Touch тощо).


коли я підключаю делегата, я отримую попередження та / або помилки. Я бачив ваш шлях раніше, але чомусь не вдається змусити його працювати. Чи могли б ці методи перейти у viewDidLoad?
noobsmcgoobs

1
Якщо ви отримували помилки, коли ви намагалися встановити делегат textField для себе, ви, ймовірно, не додали UITextFieldDelegate до визначення класу. Зокрема ... клас ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting

29

Додайте такий метод делегата 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;
}

Слід додати, що вищезазначене працює лише у тому випадку, якщо ваш контролер реалізує UITextFieldDelegate так: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK

@iPatel Я помістив ці 2 методи, а також додав self.username.delegate = self та [self.username resignFirstResponder] у viewDidLoad. Це працює для обох потрібних мені сценаріїв. Це нормально чи я використовую занадто багато коду?
noobsmcgoobs

26

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

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

24

просто скористайтеся цим способом, щоб швидко відхилити клавіатуру:

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

Швидкий 3

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

SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
miff

17

SWIFT 4:

self.view.endEditing(true)

або

Встановіть делегат текстового поля на поточний контролер перегляду, а потім:

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

    textField.resignFirstResponder()

    return true

}

Завдання-C:

[self.view endEditing:YES];

або

Встановіть делегат текстового поля на поточний контролер перегляду, а потім:

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

    return YES;
}

9

У програмі Делегат додатків можна писати

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

використовуючи цей спосіб, ви не можете писати занадто багато коду.


7

Спробуйте скласти уявлення про те, що є першим респондентом в ієрархії подання iOS. Коли ваше текстове поле стає активним (або першим відповіддю), коли ви торкаєтесь всередині нього (або becomeFirstResponderпрограмуєте його без проблем ), воно відображає клавіатуру. Отже, щоб видалити своє текстове поле від першого відповіді, вам слід надіслати resignFirstResponderце повідомлення туди.

[textField resignFirstResponder];

А щоб приховати клавіатуру на її кнопці повернення, слід реалізувати її метод делегування textFieldShouldReturn:та передати resignFirstResponderповідомлення.

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

7

Ось що я використовую у своєму коді. Це працює як шарм!

Додайте у ваш переглядcontroller.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];
}

1
просто запам’ятайте дію: @selector повинен називати те саме ім’я методу, де ви закінчуєте редагування: ТАК, в даному випадку "handleSingleTap:"
Маркос Ребукас,

4

Щоб відмовитись від клавіатури після появи клавіатури, є два випадки ,

  1. коли поле UITextField знаходиться всередині UIScrollView

  2. коли UITextField знаходиться поза UIScrollView

2. коли поле UITextField знаходиться поза UIScrollView замінює метод у вашому підкласі UIViewController

ви також повинні додати делегата для всіх UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. У вікні прокрутки натискання назовні не призведе до жодної події , тому в такому випадку використовуйте розпізнавач жестів, натисніть і перетягніть 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/


Дякую. Ваша відповідь мені допомогла ..!
Архит Капур

4

Для групи UITextViews всередині 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];
    }
}


3

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

// 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 (перегляд).


3

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

Тож ось що я зробив, щоб змусити його відхилити після торкання фону або повернення. Мені довелося додати 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

2

Просто використовуйте це в Objective-C, щоб відхилити клавіатуру:

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

1

Спочатку потрібно додати делегат текстового поля у .h файл. якщо не оголосити (BOOL)textFieldShouldReturn:(UITextField *)textFieldцей метод не називається. тому спочатку додайте делегат і запишіть код приховування клавіатури в цей метод.

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

спробуйте це ..


0

Додати делегат: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

а потім додайте цей метод делегата

// Це повинно працювати ідеально

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

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

0

Швидкий 2:

це те, що робиться для кожної справи!

закрийте клавіатуру Doneкнопкою або Touch outSide, Nextщоб перейти до наступного вводу.

Перша зміна TextFiled Return KeyTo 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

Якщо ви не знаєте поточного контролера перегляду чи перегляду тексту, ви можете використовувати ланцюжок відповідей:

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

0

для швидких 3-4 я фіксований як

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

просто скопіюйте пасту будь-де на уроці. Це рішення просто працює, якщо ви хочете, щоб усі роботи UItextfield були однаковими, або якщо у вас є лише одна!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.