Как я должен связать viewcontrollers в раскадровке xcode?
Я хотел бы связать контроллеры представления в раскадровке xcode для достижения следующего эффекта:
A -> B -> C -> D -> E -> B -> C -> D -> E -> B ->...
где вышеупомянутые буквы представляют отдельные контроллеры представления (полноразмерные сцены). Я хочу, чтобы горизонтальный слайд переходил справа налево при переходе между представлениями, и я не хочу или не хочу сохранять состояние для предыдущих представлений (т. Е. Нет push или модального перехода). Я действительно должен передать некоторое состояние между взглядами все же.
Любые предложения о том, как наилучшим образом добиться этого, используя редактор раскадровки, код или какую-то комбинацию из них?
1 ответ
Пара вариантов выскакивают у меня:
Самое простое решение с наибольшей обратной совместимостью со старыми версиями iOS - использовать контроллер навигации, сохраняя ссылку на контроллер просмотра
B
где-то, а затем вы можете, вE
, есть немногоIBAction
это делает:[self.navigationController popToViewController:B animated:YES];
В этой модели все сегменты будут представлены в раскадровке, кроме одного из
E
вB
, для которого вы бы использовали вышеуказанный код вIBAction
(или что угодно).Если вы можете отказаться от совместимости с iOS 5, вы также можете использовать
unwind
непосредственно перейти. В этом сценарии все сегменты будут представлены в раскадровке. Но многие из нас пока не хотят отказываться от совместимости с iOS 5, поэтому, возможно, вы не захотите рассматривать это решение. Но если вы хотите использовать функцию раскрутки, вы просто определите действие раскрутки вB
, такие как:- (IBAction)backToB:(UIStoryboardSegue *)segue { // if you need to do any UI update because we got an unwind segue // back to this controller, do that here }
Как только у вас есть это действие раскручивать в
B
у вас неожиданно появится новый тип segubackToB
(хотя я бы посоветовал вам дать ему более подходящее имя), представленный вам в IB, и вы можете использовать это для перехода отE
вB
, Очевидно, что все другие push-сегменты будут представлены в вашей раскадровке как обычно.Если вы действительно не хотите использовать контроллер навигации, но не нуждаетесь в совместимости с iOS 4, вы также можете добиться этого с помощью сдерживания контроллера представления, где у вас есть родительский пользовательский контроллер контейнера,
ParentVC
, а такжеA
черезE
будут дочерние контролеры. После этого вы можете иметь собственные переходы через последовательность дочерних контроллеров.Последний вариант может быть следующим:
В этом сценарии, как и в варианте 1, вы просто используете контроллер навигации, когда
B
сначала загружен, он будет программно немедленно сделать следующее вviewDidLoad
[self presentViewController:A animated:NO];
Хотя
B
это контроллер корневого представления, это было бы похоже наA
было. когдаA
сделано это будет уволить обратноB
в какой момент вы могли бы сделать свой стандартB
-C
-D
-E
продвинуть прогресс, но потому что мы сделалиB
корневой контроллер,E
можно просто сделатьpopToRootViewControllerAnimated
чтобы вернуться кB
и вам не нужно беспокоиться о сохранении указателя наB
вокруг. Эта модель имеет большой смысл, еслиA
это контроллер входа в систему или заставка, или что-то не совсем нормальное.
Из них 1, вероятно, самый простой, 2 можно считать самым элегантным (хотя вы теряете поддержку iOS 5 и более ранних версий), 3 - вариант, если вы не возражаете написать немного больше (кто-то сложный) код, и использование памяти критично. и 4, как и 1, довольно просты, но вопрос лишь в том, имеет ли смысл этот процесс для вашего приложения. Лично я бы предпочел вариант 1 или 4, в зависимости от того, какой контроллер представления A
было. И если потребуется совместимость с iOS 4, эти два варианта будут работать и с NIB.