it-swarm.com.ru

Как отключить/включить ключ возврата в UITextField?

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

63
Sophie Alpert

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

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

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

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

23
Elliot Kroo

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

textfield.enablesReturnKeyAutomatically = YES;

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

70
Tharindu Madushanka

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

enter image description here

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

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

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

25
Kyle Clegg

Вы можете переопределить атрибут UITextFieldhasText для достижения этой цели:

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

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

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

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

16
Janne

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

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

3
SEQOY Development Team

Вот метод, который доступен из документированного 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];

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

0
Rik Renich