Как отключить клавиатуру, появляющуюся при попадании в текстовое поле, iOS?

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

Сборщик показан отлично, но проблема в том, что клавиатура появляется внизу, и я не хочу этого.

Это проект iPad, который я пытаюсь преобразовать из своего iphone. На iPhone это работает хорошо, и клавиатура всегда скрыта.

Что я могу потерять/забыть сделать здесь?

ИЗМЕНИТЬ


Для справки о том, что на самом деле произошло здесь, было то, что на самом деле оба раза (iphone и ipad) клавиатура была не скрыта. Я просто подумал, что он был скрыт в iphone, потому что мой сборщик, который выскакивал снизу, скрывал клавиатуру, поскольку она была поверх нее. Но на ipad это не так.

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

Осторожно, я принял этот ответ, потому что он отвечал специально, что я хотел. Остальные ответы правильные, и я считаю, что лучше для других реализаций.

Ответ 1

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Here You can do additional code or task instead of writing with keyboard
    return NO;
}

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

Ответ 2

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if(textfield == yourtextField)
    {
        [textfield resignFirstResponder];
        // Show you custom picker here....
        return NO;
    }     
}

и вам нужно реализовать uitextfielddelegate в контроллере.

и присвойте делегату yourtextField.

Ответ 3

Используйте делегат текстового поля.

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{        
    return NO;
}

Ответ 4

Похоже, что все эти ответы используют один подход, чтобы просто отказаться от клавиатуры до ее появления. Это предотвращает статус первого ответчика, который имеет много преимуществ.

Один простой подход, который позволяет вам поддерживать статус первого ответчика, заключается в создании пустого представления и назначении этого свойства inputView в вашем поле ввода. Если вы используете iOS 9 (или позже?), Вам также придется избавиться от объектов inputAssistantItem.

UITextField *field = [[UITextField alloc] init];
field.inputView = self.emptyKeyboard.view;

UITextInputAssistantItem *aItem = [field inputAssistantItem];
aItem.leadingBarButtonGroups = @[];
aItem.trailingBarButtonGroups = @[];

Затем, если вы хотите управлять полем из альтернативного контроллера представлений, вы можете сделать это, добавив цели:

[field addTarget:self.numberPad action:@selector(editingBegan:) forControlEvents:UIControlEventEditingDidBegin];
[field addTarget:self.numberPad action:@selector(editingEnded:) forControlEvents:UIControlEventEditingDidEnd];
[field addTarget:self.numberPad action:@selector(fieldChanged:) forControlEvents:UIControlEventEditingChanged];

Также возможно сделать это намного более чисто, подклассифицируя UITextField.

Ответ 5

Используйте делегат textField,

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
 textField=nil;
 return NO;
}

Ответ 6

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Here you can do for Specific text Field by 
    if (textField==(the text field you don't want to show keyboard)) {
        NSLog(@"don't show keyboard");
        return NO;
    }
    else {
        return YES;
    }
}

Ответ 7

версия swift 3.0

Сначала установите делегат для текстового поля

self.textfield.delegate = self

Тогда в расширении

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

Ответ 8

Свифт 3/4

  1. Добавьте: - UITextFieldDelegate в вашем классе.

  2. Добавить: - self.textField.delegate = self In ViewDidLoad

  3. последний просто добавьте эту функцию -

    func textFieldShouldBeginEditing (_ textField: UITextField) → Bool {

    return false
    

    }