2015-07-09 1 views
3

У меня есть приложение, которое использует пошаговый пользовательский интерфейс с контроллером навигации с тремя контроллерами View. Таким образом, первым представлением будет Шаг 1, второй Шаг 2 и т. Д. И все это будет встроено в контроллер навигации, чтобы пользователь мог вернуться туда и обратно. Однако, как только эта настройка будет выполнена, и пользователь нажмет кнопку «Готово», приложение программно переместится в другой раздел раскадровки, который должен быть отделен от начальной настройки. Я программно непосредственно перейти в этот раздел со следующим кодом:Остановить навигационный контроллер от влияния на другие контроллеры просмотра

let vc : AnyObject! = self.storyboard!.instantiateViewControllerWithIdentifier("welcomeViewController") 
self.showViewController(vc as! UIViewController, sender: vc) 

где «welcomeViewController» является идентификатором для последующей установки ViewController. Однако, как только это произойдет, панель управления навигатором по-прежнему появляется сверху, и вы все равно можете вернуться в меню настройки, что совсем не то, что я хочу. Вот что я имею в виду:

enter image description here

Пользователь не должен иметь возможности получить доступ к начальной настройке уже после установки. Моя раскадровка выглядит следующим образом:

enter image description here

Левые четыре коробки для установки. Правильные три окна - это «Главное меню», которое я хочу создать.

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

+0

это хороший вопрос. Я рекомендую использовать две разные раскадровки, в том числе для первоначальной настройки, а второй для вашего основного пользовательского интерфейса. – nburk

ответ

2

Это происходит потому, что в режиме segue под капотом используется ток UINavigationController, поэтому не имеет значения, выполняете ли вы программно или в раскадровках напрямую.

Существует несколько способов, как подойти к этому. Очень простой способ добиться этого - просто скрыть кнопку возврата в WelcomeViewController, используя self.navigationItem.hidesBackButton = YES;.

Однако, это действительно не решает вашу проблему, если вы действительно хотите разделить эти контроллеры и хотите избавиться от UINavigationController, который отвечал за ваш процесс настройки. То, что я бы рекомендовал для такого рода ситуаций, - использовать две разные раскадровки, одну для вашей начальной настройки и одну для основной части. Затем вы переключаете UIWindow 's rootViewController на контроллер вида из другого раскадровки программно. Это можно сделать в нескольких строках кода и помогает разделить ваши проблемы и лучше видеть визуальный обзор потока вашего приложения.

Позвольте мне знать в комментариях, если вам нужна дополнительная объяснение :)

Переключение раскадровки может быть достигнуто с помощью следующего кода:

UIStoryboard *main = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
UIViewController *welcomeViewController = [main instantiateViewControllerWithIdentifier:@"WelcomeViewController"]; 
UIWindow *mainApplicationWindow = [[[UIApplication sharedApplication] delegate] window]; 
mainApplicationWindow.rootViewController = welcomeViewController; 

Но если вы хотите создать экземпляр весь UITabBarController вы используете в вы r основной интерфейс, вам придется дать ему ID (например, MainTabBarController) в раскадровки, чтобы вы могли создать его, используя instantiateViewControllerWithIdentifier:.Итак, вместо того, чтобы инстанцировании ваш WelcomeViewController, вы будете идти:

UIStoryboard *main = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
UITabBarController *mainTabBarController = [main instantiateViewControllerWithIdentifier:@"MainTabBarController"]; 
UIWindow *mainApplicationWindow = [[[UIApplication sharedApplication] delegate] window]; 
mainApplicationWindow.rootViewController = mainTabBarController; 
+0

Если возможно, вы могли бы объяснить или ссылаться на страницу, объясняющую, как переключать раскадровки? – applemavs

+0

проверить этот ответ для объяснения деталей :) http://stackoverflow.com/questions/9896406/how-can-i-load-storyboard-programmatically-from-class – nburk

0

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

Шаг 1. Ctrl перетащите желтую иконку в верхней части UIViewController (встроенный в UINavigationController) к UIViewController вы хотите, чтобы непосредственно перейти (из UINavigationController), и выберите «Present модально»

Шаг 2. Дайте segue идентификатор в раскадровке

Шаг 3. В вашем коде, где вы хотите сделать segue, положить;

performSegue(withIdentifier: "yourSegueID", sender: self) 

Это сделает трюк и сделает вашу раскадровку более удобочитаемой.

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