Почему не работает стал стал первый ответчик?
Я добавил модал используя 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
оно работает. Почему этот метод не определен до времени выполнения?
3 ответа
Кажется как-то в iOS7, вид / объект еще не прикреплен в иерархии / окне вида. Таким образом, вызов метода через объект не выполняется. Если мы поставили некоторую задержку, и она работает, значит, в этот момент объекты прикреплены к окну.
Согласно Apple,
Объект респондента становится первым респондентом, только если текущий респондент может оставить статус первого респондента (canResignFirstResponder) и новый респондент может стать первым респондентом.
Вы можете вызвать этот метод, чтобы сделать объект респондента, такой как представление, первым респондентом. Однако вы должны вызывать его только в этом представлении, если оно является частью иерархии представлений. Если свойство окна представления содержит объект UIWindow, оно было установлено в иерархии представления; если он возвращает ноль, представление отделено от любой иерархии.
Для получения дополнительной информации см. Ссылку класса UIResponder.
Существует большая разница между вашим первым и вторым методом.
В соответствии с delay
параметр performSelector:withObject:afterDelay:
Минимальное время, до которого отправляется сообщение. Задание задержки 0 не обязательно приводит к немедленному выполнению селектора. Селектор все еще находится в очереди в цикле выполнения потока и выполняется как можно скорее.
Второй метод подождет до подходящего времени и выполнит becomeFirstResponder
,
вызовите beFirstResponder, как показано ниже, возможно, это сработает и для вас, потому что это сработало для меня
[textView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];