keyboard не - Как отключить клавиатуру iOS?





предиктивный сдвинуть (14)


Я обнаружил случай, когда 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)

У меня есть UITextfield, для которого я хотел бы отключить клавиатуру. Я не могу заставить клавиатуру уйти, независимо от того, какой код я использую.




Чтобы отменить любое текстовое поле в приложении

UIApplication.shared.keyWindow?.endEditing(true)

Этот подход является чистым и гарантированным для работы, потому что keyWindow является, по определению, корневым представлением всех возможных представлений, отображающих клавиатуру ( source ):

Ключевое окно получает клавиатуру и другие события, не связанные с касанием. Ключевым окном может быть только одно окно за раз.




3 простых и быстрых шага

Добавьте UITextFieldDelegate в свой класс, как 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
    ..
    ..
}

Теперь, когда пользователь нажимает на возвращаемый ключ, клавиатура будет уволена.

Я также подготовил фрагмент примера, вы можете проверить его here .




Бывают случаи, когда текстовое поле не является первым ответчиком, но клавиатура находится на экране. В этих случаях вышеупомянутые методы не могут отменить клавиатуру.

Один пример того, как туда добраться:

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

В этом случае вам также нужно попросить контроллер вида выйти из режима редактирования:

[viewController setEditing:NO animated:YES];



Вы только что заменили yourTextFieldName , вы уже догадались! ваше текстовое поле. Это закроет клавиатуру.

[yourTextFieldName resignFirstResponder];



[myTextField resignFirstResponder]

Here второй абзац раздела «Управление клавиатурой».




В вашем представлении контроллера файла 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];
}



-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    // your code

    [textField reloadInputViews];
}



-(void)methodName
{
    [textFieldName resignFirstResponder];
}

вызовите этот метод (methodName) с помощью didEndOnExit




в крайнем случае 💩

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



Если вы не знаете, какой 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]);



Это отменит одно текстовое поле

// Swift
TextField.resignFirstResponder()

// Objective C
[TextField resignFirstResponder];

Чтобы отменить любое текстовое поле, используйте ниже код

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

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



Я предлагаю вам добавить и действие в файл заголовка:

-(IBAction)removeKeyboard;

И в реализации напишите что-нибудь вроде этого:

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

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

Надеюсь, поможет!




Если вам не нужно передавать какие-либо аргументы, нужно использовать простой способ valueForKeyPath. Это возможно даже для Classобъекта.

NSString *colorName = @"brightPinkColor";
id uicolor = [UIColor class];
if ([uicolor respondsToSelector:NSSelectorFromString(colorName)]){
    UIColor *brightPink = [uicolor valueForKeyPath:colorName];
    ...
}




ios keyboard