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

Я добавил модал используя 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];
Другие вопросы по тегам