Як відхилити клавіатуру iOS?


74

У мене є UITextfield, для якого я хотів би відмовитися від клавіатури. Здається, я не можу змусити клавіатуру зникнути незалежно від того, який код я використовую.

Відповіді:



192

Якщо у вас є кілька текстових полів, і ви не знаєте, який із них відповідає першим (або у вас просто немає доступу до текстових полів звідки б ви не писали цей код), ви можете зателефонувати endEditing:в батьківському поданні, що містить текстові поля.

У методі контролера подання це виглядатиме так:

[self.view endEditing:YES];

Параметр змушує текстове поле звільнитись із статусу першого відповідача. Якщо ви використовували делегата для перевірки і хотіли зупинити все, доки вміст текстового поля не буде дійсним, ви можете також кодувати його так:

BOOL didEndEditing = [self.view endEditing:NO];
if (didEndEditing) {
    // on to the next thing...
} else {
    // text field must have said to first responder status: "never wanna give you up, never wanna let you down"
}

endEditing:Метод набагато краще , ніж говорити окремі текстові поля resignFirstResponder, але з якоїсь - то причини я навіть не дізнався про це до недавнього часу .


71
Блін! Я не можу повірити, що я щойно прокрутив коментар до коду.
Lytol

8

Бувають випадки, коли текстове поле не є першим відповідачем, але клавіатура знаходиться на екрані. У цих випадках вищевказані методи не дозволяють відхилити клавіатуру.

Один приклад того, як туди дістатися:

  1. програмно натиснути на екран ABPersonViewController; відкрити будь-який контакт;
  2. торкніться поля "примітка" (яке стає першим реагуючим і запускає клавіатуру);
  3. проведіть пальцем ліворуч у будь-якому іншому полі, щоб з’явилася кнопка «видалити»;
  4. до цього моменту у вас немає першого відповідача серед текстових полів (просто перевірте програмно), але клавіатура все ще там. Виклик [view endEditing: YES] нічого не робить.

У цьому випадку вам також потрібно попросити контролер перегляду вийти з режиму редагування:

[viewController setEditing:NO animated:YES];

8

Я виявив випадок, коли endEditingі resignFirstResponderне вдається. Це спрацювало для мене в тих випадках.

ObjC

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];    
[self setEditing:NO];

Стрімкий

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

Саме те, що я шукав!
Hola Soy Edu Feliz Navidad

6

Пропоную додати та вжити дії щодо вашого заголовного файлу:

-(IBAction)removeKeyboard;

А у реалізації напишіть щось на зразок цього:

-(IBAction)removeKeyboard
{
[self.textfield resignFirstResponder];
}

У файлі NIB підключіться з UITextFiled до власника файлу за опцією DidEndOnExit. Таким чином, при натисканні клавіші повернення клавіатура зникне.

Сподіваюся, це допоможе!


6

У своєму файлі контролера перегляду YourViewController.h переконайтеся, що ви реалізуєте протокол UITextFieldDelegate:

@interface YourViewController : <UITextFieldDelegate>

@end

Потім у файлі YourViewController.m реалізуйте такий метод екземпляра:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.yourTextField1 resignFirstResponder];
    [self.yourTextField2 resignFirstResponder];
    ...
    [self.yourTextFieldn resignFirstResponder];
}

3

Це звільнить одне конкретне текстове поле

// Swift
TextField.resignFirstResponder()

// Objective C
[TextField resignFirstResponder];

Щоб звільнити будь-яке текстове поле, використовуйте код нижче

// Swift
self.view!.endEditing(true)

// Objective C
[self.view endEditing:YES];

3

Звільнити будь-яке текстове поле в програмі

UIApplication.shared.keyWindow?.endEditing(true)

Цей підхід є чистим і гарантовано працює, оскільки keyWindow є, за визначенням, кореневим видом усіх можливих видів, що відображають клавіатуру ( джерело ):

У вікні клавіш приймаються клавіатура та інші події, не пов’язані з дотиком. Лише одне вікно за раз може бути ключовим вікном.


3

в крайньому випадку 💩

let dummyTextView = UITextView(frame: .zero)
view.addSubview(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()
dummyTextView.removeFromSuperview()

У мене був користувальницький інтерфейс, де я мав UITextFieldпершого реагуючого, але вікно, що відображає пропозиції, також активне. Закриття клавіатури кнопкою приховування якось не приховувало клавіатуру. Цей код мені тут допоміг, дякую! :)
fl034,

2

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

UIView *resignFirstResponder(UIView *theView)
{
    if([theView isFirstResponder])
    {
        [theView resignFirstResponder];
        return theView;
    }
    for(UIView *subview in theView.subviews)
    {
        UIView *result = resignFirstResponder(subview);
        if(result) return result;
    }
    return nil;
}

Потім у коді виклику:

    UIView *resigned = resignFirstResponder([UIScreen mainScreen]);

1

Ви просто замінюєте yourTextFieldNameна, ви вже здогадалися! Ваше текстове поле. Це закриє клавіатуру.

[yourTextFieldName resignFirstResponder];


1

Для Свіфта 3

Клавіатуру можна сховати так:

textField.resignFirstResponder()

Якщо ви хочете приховати клавіатуру, коли користувач натискає кнопку "вступ", вам доведеться застосувати такий UITextFieldDelegateспосіб:

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

    textField.resignFirstResponder()

    return true
}


0

3 простих і швидких кроки

Додайте UITextFieldDelegateдо свого класу, як показано нижче:

class RegisterVC: UIViewController, UITextFieldDelegate {
    //class implementation 
}

у реалізації класу додайте функцію делегата textFieldShouldEndEditing::

internal func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return true
}

і на останньому етапі встановіть своїх UITextFieldделегатів (-ів) на себе, десь доречно. Наприклад, всередині viewDidLoadфункції:

override func viewDidLoad(){
    super.viewDidLoad()
    myTextField1.delegate = self
    myTextField2.delegate = self
    ..
    ..
}

Тепер, коли користувач натискає клавішу повернення, клавіатура відхиляється.

Я також підготував прикладний фрагмент, ви можете перевірити його звідси .


-1
  1. Налаштуйте подію "Did End On Exit" у Xcode (клацніть правою кнопкою миші на текстовому полі).

    Знімок екрана

  2. Зрозумійте цей метод:

    -(IBAction) closeKeyboard:(id) sender {
        [_txtField resignFirstResponder];
    }
    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.