Несколько мыслей, не обязательно гарантированных, чтобы быть правильными, но, возможно, приведут вас в правильном направлении: если я правильно понимаю вашу проблему, в основном у вас есть конкретные действия, которые в какой-то момент (скажем, по завершении) должны отображать модальные представление, но указанное действие не имеет ссылки на контроллер представления, который в данный момент находится на экране (например, возможно, вы выполняете задачу в фоновом режиме и позволяете пользователю все еще перемещаться по вашей программе и хотите предупредить пользователя по завершении).
Полагаю, как вы будете обходить это, будет зависеть от общей архитектуры вашего приложения. В большинстве приложений есть корневой контроллер представления, который управляет навигацией: возможно, у вас есть UITabBarController
, который вы создаете в делегате приложения, и вся навигация отключается от этого контроллера. Вы можете просто отобразить свой модальный контроллер представления через этот контроллер представления верхнего уровня (вы, вероятно, будете делать это внутри вашего делегата приложения).
В качестве альтернативы, вы можете отказаться от идеи отображения модальных контроллеров представления и прикрепить представление непосредственно к окну вашего приложения. Если вы посмотрите на довольно популярную библиотеку, такую как MBProgressHUD
, то увидите, что можете присоединить модальные представления загрузки, предлагаемые к окну приложения, в котором находятся все ваши контроллеры представления.
Таким образом, есть ряд различных стратегий для достижения того, что вы хотите. Я не обязательно скажу, что ваша проблема - результат плохого дизайна приложения, поскольку существуют сценарии, когда вам может потребоваться отобразить какой-то модальный диалог и не знать, какой контроллер представления был виден в данный момент. Тем не менее, в приведенном вами примере - наблюдатель транзакции StoreKit, который показывает ход загрузки - можно было бы предположить, что он будет запущен после дискретного действия (например, при покупке продукта), и вы будете знать, какой контроллер представления был запущен из .