Как отключить / включить ключ возврата в UITextField? - PullRequest
64 голосов
/ 25 апреля 2009

Есть ли способ программно включить или отключить клавишу возврата на UIKeyboard? Самое близкое, что я мог найти, это enablesReturnKeyAutomatically, но это только скажет, отключить ли его вообще.

Ответы [ 6 ]

72 голосов
/ 08 июля 2012

Может быть следующий фрагмент кода помогает.

textfield.enablesReturnKeyAutomatically = YES;

Это общедоступно в iPhone SDK в UITextInputTraits. Благодаря этому клавиша возврата будет отключена, если в текстовом поле нет входного текста

25 голосов
/ 14 декабря 2013
Свойство

UITextField enablesReturnKeyAutomatically можно установить прямо в Интерфейсном Разработчике, просто выделите текстовое поле и откройте инспектор Атрибутов. Как сказал Таринду, это автоматически включит и отключит клавишу возврата в зависимости от того, был ли введен какой-либо текст.

enter image description here

Конечно, если вам нужно изменить это в коде, вы все равно можете установить его программно, используя nameTextField.enablesReturnKeyAutomatically = true.

РЕДАКТИРОВАТЬ, чтобы устранить недостатки:

В противном случае, нет официального способа включить и отключить клавишу возврата по команде. Я бы рекомендовал не пытаться использовать частные API для этого. В качестве альтернативы вы можете использовать метод делегата textFieldShouldReturn: и поместить туда свое условие / проверку и соответственно ответить.

23 голосов
/ 25 апреля 2009

Если вы можете получить сам объект UIKeyboard (что-то, что не отображается в SDK, учтите, что Apple может не обрадоваться, если вы используете эти вызовы), тогда есть удобная функция setReturnKeyEnabled: member.

id keyboard = [self magicallyGetAUIKeyboardInstance];
[keyboard setReturnKeyEnabled: NO];

(через свалка Эрики Садун из 2.2-фреймворков iPhone)

Реализация magicallyGetAUIKeyboardInstance описана здесь .

16 голосов
/ 01 сентября 2017

Вы можете переопределить атрибут UITextField hasText, чтобы добиться этого:

class CustomTextField : UITextField {
    override public var hasText: Bool {
        get {
            return evaluateString(text)
        }
    }
}

Где evaluateString(_ text: String?) -> Bool проверяет ваши необходимые критерии ввода, например, количество символов.

Конечно, это работает только в сочетании с enablesReturnKeyAutomatically = true, установленным на UITextField.

Мне известно, что мой ответ не является ни своевременным, ни написанным в Objective-C, но, учитывая, что я не смог найти ответ где-либо еще, и этот вопрос обычно упоминается в других темах, я думаю, что здесь лучшее место, чтобы опубликовать это.

3 голосов
/ 27 октября 2009

Хорошая идея - создать один файл для доступа к этому классу из любого места. Вот код:

UIKeyboard.h

#import <UIKit/UIKit.h> 

@interface UIApplication (KeyboardView)

    - (UIView *)keyboardView; 

@end

UIKeyboard.m

#import "UIKeyboard.h"

@implementation UIApplication (KeyboardView)

- (UIView *)keyboardView
{
    NSArray *windows = [self windows];
    for (UIWindow *window in [windows reverseObjectEnumerator])
    {
        for (UIView *view in [window subviews])
        {
            if (!strcmp(object_getClassName(view), "UIKeyboard"))
            {
                return view;
            }
        }
    }

    return nil;
}

@end

Теперь вы можете импортировать и получать доступ к этому классу из вашего собственного класса:

#import "UIKeyboard.h"

    // Keyboard Instance Pointer.
    UIView *keyboardView = [[UIApplication sharedApplication] keyboardView];

Полную документацию по этому классу вы можете найти здесь: http://ericasadun.com/iPhoneDocs/_u_i_keyboard_8h-source.html

Более подробную информацию вы можете найти здесь: http://cocoawithlove.com/2009/04/showing-message-over-iphone-keyboard.html

0 голосов
/ 10 мая 2018

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

- (void)setup {
    // Or in init
    self.textField.delegate = self;
}

// <UITextFieldDelegate>
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    // substitute your test here
    return [textField.text rangeOfString:@"@"].location != NSNotFound;
}

Другие ответы здесь можно использовать с

[textField addTarget:self
              action:@selector(validateTextField:)
    forControlEvents:UIControlEventEditingChanged];

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

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