Метод, который я использовал, заключался в создании подкласса UIViewController, который я использовал в качестве корневого представления для 3 дочерних контроллеров представления. Известные свойства корневого контроллера были:
- viewControllers - NSArray контроллеров представления, между которыми я переключился
- selectedIndex - индекс выбранного контроллера представления, который был установлен в 0 в viewLoad. Это неатомично, поэтому, когда вызывался setSelectedIndex, он делал всю логику, чтобы установить этот дочерний контроллер представления.
- selectedViewController - свойство только для чтения, чтобы другие классы могли определять, что в данный момент отображается
В методе setSelectedIndex вам необходимо использовать логику, подобную:
[self addChildViewController: selectedViewController];
[[self view] addSubview: [selectedViewController view]];
[[self view] setNeedsDisplay];
Это сработало очень хорошо, но, поскольку я хотел использовать один контроллер навигации для всего приложения, я решил использовать другой подход.
Я забыл упомянуть, что вы захотите очищать дочерние контроллеры представления каждый раз, когда добавляете один, чтобы не складывать кучу из них и не тратить память. Перед блоком выше звоните:
for (UIViewController *viewController in [self childViewControllers])
[viewController removeFromParentViewController];