Приложение не отображается модально, но вылетает с сообщением «Приложение пыталось модально представить активный контроллер`

#ios

#iOS

Вопрос:

Я смотрю на это уже несколько дней и не могу понять, что происходит.

У меня этот сбой затрагивает 2% пользователей в день (на iPad и iPhone, не ограничиваясь iOS 12, полная трассировка стека внизу): Application tried to present modally an active controller <DownloadViewController: 0x10a0c3c00>.

Нигде в моем коде я не вызываю UIViewController presentViewController:animated , и модальных переходов нет DownloadViewController . Всегда есть UINavigationController present (это начальный VC раскадровки).

Я попытался имитировать условия гонки, в которых переходы выполняются дважды, или где a UIAlertController остается отображаемым после того, как UIViewController под ним исчез, и он пытается выполнить переход к активному VC, но я не могу воспроизвести этот сбой: максимум, что я могу вызвать, это DownloadViewController дважды нажать на UINavigationController (не до концамира и без сбоев).

Этот сбой начал происходить после того, как я добавил некоторые UIAlertController s, поэтому я предполагаю, что они имеют к этому какое-то отношение, но я не могу понять, как.

Есть идеи, куда идти дальше?


 Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x2201b0518 __exceptionPreprocess
1  libobjc.A.dylib                0x21f38b9f8 objc_exception_throw
2  UIKitCore                      0x24c01859c -[UIViewController _presentViewController:withAnimationController:completion:]
3  UIKitCore                      0x24c01aa7c __63-[UIViewController _presentViewController:animated:completion:]_block_invoke
4  UIKitCore                      0x24c033570 -[_UIViewControllerTransitionCoordinator _applyBlocks:releaseBlocks:]
5  UIKitCore                      0x24c02f930 -[_UIViewControllerTransitionContext _runAlongsideCompletions]
6  UIKitCore                      0x24c02f608 -[_UIViewControllerTransitionContext completeTransition:]
7  UIKitCore                      0x24ca2ba00 -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:]
8  UIKitCore                      0x24ca02758 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
9  UIKitCore                      0x24ca02d2c -[UIViewAnimationState animationDidStop:finished:]
10 UIKitCore                      0x24ca02dcc -[UIViewAnimationState animationDidStop:finished:]
11 QuartzCore                     0x22464f958 CA::Layer::run_animation_callbacks(void*)
12 libdispatch.dylib              0x21fbf17d4 _dispatch_client_callout
13 libdispatch.dylib              0x21fb9f004 _dispatch_main_queue_callback_4CF$VARIANT$mp
14 CoreFoundation                 0x220141ec0 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
15 CoreFoundation                 0x22013cdf8 __CFRunLoopRun
16 CoreFoundation                 0x22013c354 CFRunLoopRunSpecific
17 GraphicsServices               0x22233c79c GSEventRunModal
18 UIKitCore                      0x24c5afb68 UIApplicationMain
19 WeDownload                     0x100ea1f40 main (main.m:14)
20 libdyld.dylib                  0x21fc028e0 start
  

Комментарии:

1. что UIAlertController делать? Имеет ли действие какое-то отношение к этому DownloadViewController ?

2. Он может выполнить запуск из VC перед загрузкой в него ViewController. Переход — это show segue — использует UINavigationController

3. какое действие приводит к этому сбою?

4. Я не могу воспроизвести сбой

5. … отвлекающий маневр, в конце концов, это была не анимация клавиатуры, но я становлюсь ближе…

Ответ №1:

Решаемая проблема. Проблема заключалась в том, что внутри такого блока:

[UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{

… Я фактически вызывал [self presentViewController:alert animated:YES completion:nil]; два раза подряд (где alert был UIAlertController).

Самое важное: в сообщении об ошибке Application tried to present modally an active controller <DownloadViewController: 0x10a0c3c00> DownloadViewController является докладчиком, а не тем, что представлено. Я бы понял это на несколько дней раньше, если бы правильно понял это сообщение об ошибке.

Комментарии:

1. Спасибо. Это действительно важно и стоит повторить: контроллер представления в сообщении об ошибке — это контроллер представления, который пытался представить уже активный контроллер представления, а не контроллер представления, который уже был активен.

2. Обратите внимание, что формулировка была улучшена в iOS 14 SDK: Application tried to present modally a view controller <UITableViewController: 0x7ff91080a700> that has a parent view controller <UINavigationController: 0x7ff91000f000>.

3. @JordanH, привет, ты можешь это решить? Сегодня я получил эту ошибку!!