2016-05-11 2 views
3

После iOS 8 изменение моей реализации на UIAlertController вместо UIAlertView дает мне некоторые головные боли.UIAlertController увольнение медленное

Увольнение занимает целую секунду, прежде чем пользовательский интерфейс станет отзывчивым после нажатия кнопки. Это означает, что пользователи думают, что что-то не так.

Я единственный, кто страдает от этого? Это в нескольких приложениях, и для реализации это просто так просто. Я попробовал это в новом пустом проекте.

- (IBAction)showAlertView { 

    [[[UIAlertView alloc] initWithTitle:@"test" message:@"test" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] show]; 
} 

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 

    NSLog(@"this is fast"); 
} 

-(IBAction)showAlert { 

    UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"test" message:@"test" preferredStyle:UIAlertControllerStyleAlert]; 

    [controller addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 

     NSLog(@"this is slow"); 

    }]]; 

    [self presentViewController:controller animated:NO completion:nil]; 

} 

Нажатие кнопки дает около 1-секундной задержки, прежде чем что-либо будет напечатано на консоли. Презентация предупреждения не откладывается вообще.

Редактировать: Ближе к времени это, вероятно, больше похоже на 700 мс, поэтому не полная секунда, но все еще слишком длинная для чего-то, что должно быть мгновенным.

+0

Медленный отклик пользовательского интерфейса часто вызван выполнением задач пользовательского интерфейса на фоновом потоке. Вы представляете это предупреждение из асинхронного обработчика завершения? У UIAlertController нет никакой общей проблемы. – Paulw11

+0

Это всего лишь код, как есть. Ничего не запускается ни в каких явных потоках. Я мог бы привязать код выше к IBAction и нажать кнопку, чтобы представить контроллер, он все равно будет медленным. Это было так каждый раз, когда я использовал его во всех приложениях. Я очень смущен. – nickdnk

+0

Похоже, что он ждет увольнения во многом так же, как это происходит, если убрать диспетчер просмотра анимированный (например, покройте вертикаль). Без анимации при увольнении вы получаете такую ​​же задержку, о которой я говорю. – nickdnk

ответ

3

Я знаю, что это старый вопрос, но у меня была такая же проблема, и добавив это в ViewController предъявившему UIAlertController решил это для меня:

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

Swift версия:

override func canBecomeFirstResponder() -> Bool { 
    return true 
} 
+0

Кажется, не имеет никакого значения. – nickdnk

+0

Тогда есть что-то еще, что неправильно. Вот чистый проект, когда задержка исчезла после переопределения canBecomeFirstResponder. [link] (https://www.dropbox.com/s/n56d44nozjecjzx/AlertControllerTest.zip?dl=0) Он содержит версии swift и obj-c и работает как на iOS 8, так и на 9.Вы можете поэкспериментировать и изменить возвращаемое значение на NO/false, и вы заметите, что задержка 0,7 сек возвращается. – nihilvex

+0

Работает для меня. Интересно, каков основной механизм такого поведения. – JonSlowCN

1

К сожалению, отменяя canBecomeFirstResponder не помогли нам.

Что нам помогло - позвонить по телефону resignFirstResponder на любых возможных ответчиках в контроллере просмотра ПЕРЕД показом предупреждения.

По какой-то причине, если текстовое поле было первым ответчиком, похоже, что оно попытается пройти через иерархию представлений, ища следующего ответчика. Если текстовые поля не были сосредоточены, задержка исчезла.

+0

Я знаю, что сейчас это старая проблема, но я испытываю то же самое. Мы отбрасываем поддержку iOS 7/8 и получаем предупреждения об устаревании на 'UIAlertView'. При конвертации в 'UIAlertViewController' я наблюдаю ту же самую задержку почти через секунду после нажатия. Обработчик действий просто не называется достаточно быстро. У меня нет текстовых полей или какого-либо объекта, являющегося firstResponder в этом представлении, насколько я знаю. Точно так же, как вы не могли иметь в своем вопросе, когда вы заявляли, что это также происходит в совершенно новом проекте (без каких-либо текстовых комментариев) .. – Sti

Смежные вопросы