Игнорировать вкладку в UITextField... (приложение для iPad)

У меня есть TableView с TextFields в каждой ячейке, и я хочу, чтобы эти текстовые поля игнорируйте вкладку символов (\t).

При нажатии клавиши табуляции метод textField:shouldChangeCharactersInRange, который он не назвал

Кто-нибудь знает, как это сделать? Я знаю, что в iPad нет ключа для вкладок клавиатура, но blutooth и док-станции делают и запускают действительно странное поведение.

Спасибо

Ответы

Ответ 1

Кажется, это проблема с символом вкладки (\t). Этот символ не обрабатывается как обычные символы (например, a, b, c, 0, 1, 2,...) и, следовательно,

              - (BOOL)textField:(UITextField *)textField 
  shouldChangeCharactersInRange:(NSRange)range 
              replacementString:(NSString *)string;

метод делегата никогда не будет вызван.

Результат использования вкладки, например. внешняя клавиатура или симулятор - это то, что текущее текстовое поле подает в отставку статус первого ответчика и результат

[textField nextResponder]

вместо этого станет первым ответчиком.

В настоящее время IMO является ошибкой (iOS SDK 4.3) заключается в том, что метод делегата

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField

вызывается только один раз (когда вы возвращаете да), и когда вы повторно выбираете одно и то же текстовое поле и снова используете клавишу табуляции, метод больше не будет вызываться.

Ответ 2

Убедитесь, что делегат для UITextField установлен в IB или коде. Убедитесь, что ваш файл .h имеет указанный UITextFieldDelegate.

Теперь все должно работать.

Ответ 3

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

Ответ 4

Внедрите этот метод:

Добавьте это в свой AppDelegate.m

- (NSArray *)keyCommands {
static NSArray *commands;

static dispatch_once_t once;
dispatch_once(&once, ^{
    UIKeyCommand *const forward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:0 action:@selector(ignore)];
    UIKeyCommand *const backward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:UIKeyModifierShift action:@selector(ignore)];

    commands = @[forward, backward];
});

return commands;
}

Добавьте этот метод в ViewController.m или подкласс UITextField, в котором вы хотите обработать событие TAB

- (void)ignore {

    NSLog(@"Your Action");
} 

Описан в: Как установить порядок вкладок в iOS?

Ответ 5

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

больше на shouldChangeCharactersInRange здесь