Как мне убедиться, что правильный ViewController загружен при принятии файла?
РЕДАКТИРОВАТЬ: один вопрос слева внизу - как убедиться, что я не вызываю методы до того, как любой VC, представленный контроллером навигации, должным образом закончен, выскочив.
РЕДАКТИРОВАТЬ: полезный учебник для выполнения почти то, что я хочу, но не совсем.
Итак, у меня есть эта настройка
Начальный VC -> Контроллер вкладок -> (три VC, один из них...) NavController, содержащий список файлов -> Редактор файлов
В любое время я могу получить сообщение application:handleOpenUrl, отправленное моему делегату приложения, в котором говорится, что пользователь хочет отредактировать файл, например, вложение из электронного письма. В зависимости от состояния моего приложения все или некоторые из этих VC могут быть загружены. Чтобы разумно реагировать на URL, мне нужно, чтобы NavController загружался как минимум.
Я предполагаю, что реальная цель состоит в том, чтобы привести приложение в состояние, в котором загружен NavController, и текущий активный контроллер, чтобы я мог отправить ему сообщение из AppDelegate для загрузки данного файла после его обработки.
Итак: что такое лучшая практика здесь?
РЕДАКТИРОВАТЬ
Так что я немного поиграл, и получил это далеко:
Я знаю, что корневой VC является UITabBarController и всегда загружается.
Я знаю, что мой NavigationController имеет индекс 2
Я знаю, что он либо загрузил NC, либо сделает это по требованию, если я переключусь на вкладку
Итак, алгоритм таков: возьмите корневую вкладку VC. Скажите, чтобы он переключился на вкладку 2, если ее там еще нет. Возьмите NavigationController на вкладке 2. Откройте его и укажите, что делать.
Теперь моя единственная проблема заключается в том, что в этом коде действие, которое я вызываю в корневом VC контроллера Navigation, выполняется ДО того, как любой VC, представленный в настоящее время NC, должен изменить viewWillDisappear.
UITabBarController *root = (UITabBarController*) self.window.rootViewController;
if (root.selectedIndex != 2) {
root.selectedIndex = 2;
};
UINavigationController *nc = root.viewControllers[2];
[nc popToRootViewControllerAnimated:YES];
NSObject<SGPTFileManagerViewProtocol> *fileManager = (NSObject<SGPTFileManagerViewProtocol> *) nc.visibleViewController;
// Whoops! This method is invoked before the navigation controller is done popping a presented view controller!
[fileManager METHOD-FOR-HANDLING-THE-URL-HERE];
1 ответ
Что ж, получается, что это немного сложно, и не существует неконтролируемых решений.
Причина, по которой это сложно, проста: поскольку никакой посторонний не может знать, как вы хотите, чтобы состояние вашего приложения реагировало на открытый URL-адрес, нет никакого способа создать фреймворк. Вы остаетесь с основными инструментами самоанализа, обхода иерархии представлений и т. Д.
Полезный совет: вы можете отладить процесс открытия URL-адреса на устройстве. Перейдите в профиль отладки и настройте его на ожидание запуска приложения вручную. Вы не можете перейти к своей электронной почте или там, где бы вы ни находились, и вызвать ссылку, и отладчик сработает при запуске вашего приложения.
В XCode 5: Продукт -> Схема -> Редактировать схему (схема запуска) выберите опцию запуска "Ожидание запуска вручную".