Как я должен связать viewcontrollers в раскадровке xcode?

Я хотел бы связать контроллеры представления в раскадровке xcode для достижения следующего эффекта:

A -> B -> C -> D -> E -> B -> C -> D -> E -> B ->...

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

Любые предложения о том, как наилучшим образом добиться этого, используя редактор раскадровки, код или какую-то комбинацию из них?

1 ответ

Решение

Пара вариантов выскакивают у меня:

  1. Самое простое решение с наибольшей обратной совместимостью со старыми версиями iOS - использовать контроллер навигации, сохраняя ссылку на контроллер просмотра B где-то, а затем вы можете, в E, есть немного IBAction это делает:

    [self.navigationController popToViewController:B animated:YES];
    

    В этой модели все сегменты будут представлены в раскадровке, кроме одного из E в B, для которого вы бы использовали вышеуказанный код в IBAction (или что угодно).

  2. Если вы можете отказаться от совместимости с 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у вас неожиданно появится новый тип segu backToB (хотя я бы посоветовал вам дать ему более подходящее имя), представленный вам в IB, и вы можете использовать это для перехода от E в B, Очевидно, что все другие push-сегменты будут представлены в вашей раскадровке как обычно.

  3. Если вы действительно не хотите использовать контроллер навигации, но не нуждаетесь в совместимости с iOS 4, вы также можете добиться этого с помощью сдерживания контроллера представления, где у вас есть родительский пользовательский контроллер контейнера, ParentVC, а также A через E будут дочерние контролеры. После этого вы можете иметь собственные переходы через последовательность дочерних контроллеров.

  4. Последний вариант может быть следующим:

    BABCDE

    В этом сценарии, как и в варианте 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.

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