Подтвердить что ты не робот

Почему startFirstResponder не работает?

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

Это не работает:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.placesTextField becomeFirstResponder];
}

Вызов becomeFirstResponder не работает, и клавиатура не отображается.

Это работает:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.placesTextField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
}

Однако, если я вручную отправлю сообщение с помощью performSelector:withObject:afterDelay, он будет работать. Почему этот метод не определяется до времени выполнения?

4b9b3361

Ответ 1

Кажется, что-то в iOS7, view/object еще не привязан к иерархии представлений /window. Поэтому вызов метода над объектом не выполняется. Если мы поместим некоторую задержку, и она работает, значит, в этот момент объекты привязаны к окну.

В соответствии с Apple,

Объект-ответчик становится только первым ответчиком, если текущий ответчик может уйти с статуса первого ответчика (canResignFirstResponder) и новый ответчик может стать первым ответчиком.

Вы можете вызвать этот метод, чтобы создать объект-ответчик, такой как вид первый ответчик. Однако вы должны называть это только в том случае, если оно является частью иерархии представлений. Если свойство окна views содержит UIWindow, он был установлен в иерархии представлений; если оно возвращает nil, представление отделяется от любой иерархии.

Подробнее см. Ссылка на класс UIResponder.

Ответ 2

Существует разница большой между вашим первым и вторым методами.

В параметре delay performSelector:withObject:afterDelay:

Минимальное время, в течение которого отправляется сообщение. Указание задержки 0 не обязательно приводит к тому, что селектор будет выполняться немедленно. Селектор по-прежнему поставлен в очередь на цикл выполнения потоков и выполняется как можно скорее.

Второй способ будет ждать соответствующего времени и выполнить becomeFirstResponder.