it-swarm.com.ru

Почему не работает стал стал первый ответчик?

Я добавил модал используя 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, это работает. Почему этот метод не определен до времени выполнения?

21
Ravi

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

Согласно Apple,

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

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

Для более подробной информации смотрите Ссылка на класс UIResponder .

7
βhargavḯ

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

Согласно параметру delayperformSelector:withObject:afterDelay:

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

Второй метод подождет до подходящего времени и выполнит becomeFirstResponder.

0
fujianjin6471