Как мне убедиться, что правильный 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: Продукт -> Схема -> Редактировать схему (схема запуска) выберите опцию запуска "Ожидание запуска вручную".

Другие вопросы по тегам