2014-01-29 3 views
1

У меня сложный поток между контроллерами представлений (vc). Когда мой главный контроллер просмотра показывает, он проверяет, вошел ли пользователь в систему, а если нет, то он вставляет vc в viewWillAppear. Затем логин может нажимать регистр vc. Кроме того, при первом запуске приложения он также показывает специальный vc, также из основного vc's viewWillAppear (только один раз). Не имеет значения, был ли пользователь зарегистрирован или пропустил вход в систему.iOS сложная навигация между контроллерами вида

Приложение может быть открыто также пользовательскими URL-адресами, которые должны открыть один из моих vcs. Приложение должно начинаться/возобновляться на этом экране без какого-либо перехода между vcs. Весь этот поток обрабатывается из моего основного vc, который обрабатывает его в viewWillAppear и в didBecomeActive, который является наблюдателем для приложения UIApplicationDidBecomeActiveNotification. Некоторые из этих пользовательских URL-адресов должны сначала открыть экран входа в систему.

Мой наивный подход состоял в том, чтобы справиться со всей этой логикой в ​​моем главном vc's viewWillAppear, где я нажал базу vcs на текущее состояние. Это работает для толкания экрана входа в начало приложения без каких-либо проблем. Проблема в том, что когда я вернусь от входа и мне нужно нажать другой vc. Главный контроллер навигации знает, что что-то было нажато (кнопка назад становится видимой), но старый vc видимый (основной) с частично разбитыми представлениями и не реагирует на события касания. Нажатие кнопки «Назад» делает полный беспорядок из моего приложения.

Я googled, и проблема, кажется, в том, что мы не можем нажать vc, пока другой появляется. Я нашел BufferedNavigationController, который решает это, но он не работает правильно в iOS7. Я даже не вижу никаких журналов в консоли устройства.

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

В настоящий момент я пришел с быстрым взломом, где я создаю пользовательскую заднюю часть для всех ситуаций и устанавливаю ее как задний стек навигационного контроллера и нажимаю последний vc поверх этого стека. Затем на экранах входа/регистрации я изменяю стоп-кадр, если пользователь пропустил процесс входа/регистрации. Это уродливое взломать не очень перспективное решение. Я хотел бы централизованно контролировать нажатие vcs в одном месте, и в этой ситуации не может быть видимого перехода между ними.

Есть ли лучшее/более надежное решение для достижения этого? Я не могу видеть видимый переход при возврате из одного vc (это анимируется), а vc под ним должен подтолкнуть другого поверх него, пока он становится видимым (без анимации этого нажатия). Похоже, мы вернулись на совершенно другой экран? Независимо от того, может ли это быть запутанным для пользователей, то есть для другого вопроса.

EDIT 1: Я ориентируюсь на iOS7 и новее только.

EDIT 2: Вот sample demo, который показывает мою проблему. Я направил ссылку на главный vc, который толкает другие vcs в его viewWillAppear (другие vcs не важны). Это просто для презентационных целей.

Эта демонстрация показывает журналы в консоли «Вложенная анимация push может привести к поврежденной навигационной панели» и «Завершение перехода навигации в непредвиденном состоянии. Дерево навигации навигации панели может быть повреждено». которые не отображаются в моем большом проекте. Я знаю, что они означают, но как я могу нажать vc, когда antoher выскочит? Указанный BufferedNavigationController не работает для меня на iOS 7 (и это не проблема, что он не использует ARC).

EDIT 3: Когда я впервые запустил предоставленную демоверсию, он откроет экран входа в систему вместо основного - хорошего. Затем, нажав на логин, он вернется на главный экран и должен мгновенно нажать другой экран, не видя главного. Это не так, главное видно, но navbar считает, что есть что-то выше основного, таким образом, видимая кнопка назад. Это развращает backstack ...

+0

Я не могу понять проблему, но https://github.com/vasanth3008/NavigaitonDemo.git Этот метод может помочь u – CoolMonster

+0

При первом запуске демонстрации он откроет экран входа в систему вместо главное - хорошо. Затем, нажав на логин, он вернется на главный экран и должен мгновенно нажать другой экран, не видя главного. Это не так, главное видно, но navbar считает, что есть что-то выше основного, таким образом, видимая кнопка назад. Он развращает заднюю часть. Ваше решение отключает нажатие другого экрана, что не то, что мне нужно ... – shelll

+0

есть ли какие-либо проблемы с этим – CoolMonster

ответ

0

https://stackoverflow.com/a/20947860/1405008

см это для первого сценария, как открытый логин или другой контроллер представления.

Для пользовательского URL-адреса u вы также можете использовать ту же логику и проверить и представить, когда она поступает с пользовательского URL-адреса.

Всегда устанавливайте корневой режим. Контроллер будет самым простым способом сделать этот вид различных навигационных материалов в вашем приложении, а также этот подход позволит избежать нежелательного контроллера вида в стеке.

+0

'didFinishLaunchingWithOptions' не вызывается, когда приложение возобновляется с фона. Он вызывается только тогда, когда приложение было убито/еще не запущено. Мой контроллер корневого представления всегда является навигационным vc, который установлен в раскадровке. Затем в моем приложении я использую segues или push vcs вручную. И он по-прежнему не решает нажимать vc, когда появляется antoher. – shelll

+0

Почему вы хотите поп-а нажимать – CoolMonster

+0

Я хочу, чтобы наоборот, нажимайте во время разговора. Моему главному vc нужно нажать еще один vc, когда он вернется с определенного vc, без перехода, прежде чем mian vc станет видимым, поэтому я использую 'viewWillAppear'. Таким образом, похоже, что верхний vc вернулся на другой экран. – shelll

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