Как я могу отклонить клавиатуру программно? - PullRequest
2 голосов
/ 22 января 2012

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

Чтобы быть более точным, мне нужно знать, какой UITextField выбран, чтобы скрыть клавиатуру. Причина, по которой мне это нужно, заключается в том, что я хочу создать UIToolbar для добавления ко всем UITextField в качестве аксессуара для ввода. На этом UIToolbar я добавлю кнопку «Готово», при нажатии это должно скрыть клавиатуру для текущего выбранного UITextField.

Ответы [ 6 ]

1 голос
/ 21 сентября 2013

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

[self.view endEditing:YES]

Из документов:

endEditing:

Заставляет представление (или одно из его встроенных текстовых полей) оставьте статус первого респондента.

- (BOOL) endEditing: (BOOL) force

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

Возвращаемое значение
YES если представление отказалось от статуса первого респондента или NO, если это не так.

Обсуждение
Этот метод смотрит на текущий вид и его подпредставление иерархия для текстового поля, которое в настоящее время является первым респондентом. Если он находит один, он просит это текстовое поле подать в отставку в качестве первого респондента. Если для параметра force установлено значение YES, текстовое поле даже не запрашивается; он вынужден уйти в отставку.

1 голос
/ 22 января 2012

Я предполагаю, что вы хотите знать, какой UITextField является первым респондентом (текстовое поле, которое получает ввод с клавиатуры).

Для этого нет общедоступного API (хотя есть частный API). Вы можете отследить, какое текстовое поле является первым респондентом, вручную, используя метод textFieldDidBeginEditing: каждого делегата текстового поля, или вы можете использовать небольшую хитрость, чтобы найти первого респондента в любое время.

Вот трюк. Объект UIApplication знает, какой объект является первым респондентом, и может отправить ему сообщение. Таким образом, вы пишете такую ​​категорию на UIResponder:

UIResponder + firstResponderHack.h

#import <UIKit/UIKit.h>

@interface UIResponder (firstResponderHack)

+ (UIResponder *)firstResponderByHack;

@end

UIResponder + firstResponderHack.m

#import "UIResponder+firstResponderHack.h"

@interface FirstResponderFinder : NSObject
@property (strong, nonatomic) UIResponder *firstResponder;
@end

@implementation FirstResponderFinder
@synthesize firstResponder = _firstResponder;
@end

@implementation UIResponder (firstResponderHack)

- (void)putFirstResponderIntoFinder:(FirstResponderFinder *)finder {
    if (self.isFirstResponder)
        finder.firstResponder = self;
}

+ (UIResponder *)firstResponderByHack {
    FirstResponderFinder *finder = [FirstResponderFinder new];
    // Sending an action to nil sends it to the first responder.
    [[UIApplication sharedApplication] sendAction:@selector(putFirstResponderIntoFinder:) to:nil from:finder forEvent:nil];
    return finder.firstResponder;
}

@end

Затем вы можете найти первого респондента и проверить, является ли он UITextField, например:

UIResponder *firstResponder = [UIResponder firstResponderByHack];
if (firstResponder && [firstResponder isKindOfClass:[UITextField class]]) {
    UITextField *textField = (UITextField *)firstResponder;
    // do something with textField
}
0 голосов
/ 13 октября 2015

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

[self.view endEditing:YES];
0 голосов
/ 21 сентября 2013

Я думаю, что вам нужно изменить текстовые поля без ссылки.Итак, рекомендуемая причина использования Objective C runtime .
Это довольно просто.Во-первых:

  #import <objc/runtime.h>

Затем определите символ для его адреса:

   static char UITextFieldViewIdentifier;

Затем установите идентификатор с примерно таким:метод:

   NSString *identifier = objc_getObject(textField, &UITextFieldViewIdentifier)
0 голосов
/ 22 января 2012

Просто создайте ivar для UITextView в вашем заголовочном файле:

UITextField *editingField;
@property (nonatomic, copy) UITextField *editingField;

Тогда

- (void)textFieldDidBeginEditing:(UITextField *)textField;
{
    editingField = textField;

    // Whatever else you want to do 
}
0 голосов
/ 22 января 2012

Существует метод делегата:

- (void)textFieldDidBeginEditing:(UITextField *)textField

Документы Apple:

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

Также имеется свойство:

@property(nonatomic, readonly, getter=isEditing) BOOL editing

Документы Apple:

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

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