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


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

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

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

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

EDIT


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

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

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

8 10

8 ответов:

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

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

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

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

И дайте назначить делегата yourtextField.

Используйте делегат textfield.

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

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

Один простой подход, который позволяет поддерживать статус первого ответчика, заключается в создании пустого представления и присвоении его свойству 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.

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

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
 textField=nil;
 return NO;
}
-(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;
    }
}

Swift 3.0 version

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

self.textfield.delegate = self

Затем в расширении

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

Swift 3/4

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

  2. Добавьте: - сам.объект TextField.делегат = self In ViewDidLoad

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

    Func textFieldShouldBeginEditing (_ textField: UITextField) - > Bool {

    return false
    

    }