Почему 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
, он будет работать. Почему этот метод не определяется до времени выполнения?
Ответы
Ответ 1
Кажется, что-то в iOS7, view/object еще не привязан к иерархии представлений /window. Поэтому вызов метода над объектом не выполняется. Если мы поместим некоторую задержку, и она работает, значит, в этот момент объекты привязаны к окну.
В соответствии с Apple,
Объект-ответчик становится только первым ответчиком, если текущий ответчик может уйти с статуса первого ответчика (canResignFirstResponder) и новый ответчик может стать первым ответчиком.
Вы можете вызвать этот метод, чтобы создать объект-ответчик, такой как вид первый ответчик. Однако вы должны называть это только в том случае, если оно является частью иерархии представлений. Если свойство окна views содержит UIWindow, он был установлен в иерархии представлений; если оно возвращает nil, представление отделяется от любой иерархии.
Подробнее см. Ссылка на класс UIResponder.
Ответ 2
Существует разница большой между вашим первым и вторым методами.
В параметре delay
performSelector:withObject:afterDelay:
Минимальное время, в течение которого отправляется сообщение. Указание задержки 0 не обязательно приводит к тому, что селектор будет выполняться немедленно. Селектор по-прежнему поставлен в очередь на цикл выполнения потоков и выполняется как можно скорее.
Второй способ будет ждать соответствующего времени и выполнить becomeFirstResponder
.