Совместное использование того же UIViewController как rootViewController с двумя UINavigationControllers - PullRequest
14 голосов
/ 15 марта 2012

Обновление: Я решил пойти другим путем со своей проблемой. Вместо того, чтобы пытаться повторно использовать тот же UIViewController напрямую, я использую два ванильных UIViewControllers , которые установлены как rootViewControllers . В своих loadView методах они вызывают [storyboard instantiateViewControllerWithIdentifier:] для получения прежнего UIViewController и устанавливают свои представления в представление контроллера. В любом случае, это, вероятно, предпочтительный подход, поскольку мне нужно установить несколько переменных и делегатов.

У меня есть UIStoryBoard с UITabBarController в качестве точки входа, соединенной с двумя UINavigationControllers . Каждый из них имеет общий UIViewController в качестве корневого контроллера представления. Когда приложение запускается, выбирается первый UITabBarItem , и представление загружается, как и ожидалось. Однако, когда я выбираю второй UITabBarItem , то же представление не отображается. Я вижу UINavigationBar с черным фоном. Я делаю что-то неправильно с интерфейсом раскадровки или мне нужно вручную создать экземпляр UIViewController с помощью каждого метода UINavigationController - например, loadView?

Ответы [ 3 ]

10 голосов
/ 20 апреля 2012

Странно, это вопрос, который никто не задает.Насколько я знаю, невозможно поделиться rootViewController, который, я думаю, без сомнения, является ошибкой, поскольку, когда вы проверяете соединение на раскадровке, вы видите, что контроллер представления подключен к обоим контроллерам навигации.Я считаю это недостатком раскадровки, потому что дублирование viewControllers и повторное применение всех их соединений весьма подвержено ошибкам и делает раскадровки слишком сложными.

Я вижу ваше решение проблемы.Подобные обходные пути заставляют меня задаться вопросом, готова ли текущая функциональность раскадровки в iOS для создания приложений.Я думаю, что есть концептуальная проблема с раскадровками, Apple должна решить, представляет ли viewController на раскадровке экземпляр или если он представляет только класс, сейчас это не согласовано, поскольку вы можете видеть, что несколько сегментов могут фактически указывать натот же viewController, но на самом деле каждый segue имеет свой собственный экземпляр, почему это также не выполняется для соединений rootViewController? Я не знаю.

Как примечание, в вашем решении учитывается следующее изДокументация Apple:

"Важно. Контроллер представлений является единственным владельцем своего представления и всех создаваемых им подпредставлений. Он отвечает за создание этих представлений и за отказ от владения ими в соответствующее время, в том числе во время нехватки памяти.условия и когда сам контроллер представления выпущен.Если вы используете раскадровку или файл пера для хранения ваших объектов представления, каждый объект контроллера представления автоматически получает свою собственную копию этих представлений, когда контроллер представления запрашивает fили их.Однако, если вы создаете свои представления вручную, вы никогда не должны использовать одни и те же объекты представления с несколькими контроллерами представления. "

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html

3 голосов
/ 08 мая 2014

Я думаю, что самое простое решение состоит в том, чтобы не устанавливать корневой контроллер вида для вашего контроллера навигации в раскадровке, а затем сделать что-то подобное с вашим контроллером навигации:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIViewController *topVC = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"myTopVC"];
    [self pushViewController:topVC animated:NO];
}

Первоначальный VC становится корнем.

3 голосов
/ 08 ноября 2013

Определенно ошибка в раскадровке. Еще один способ сделать это - создать базовый UIViewControllers для каждого UINavigationController, а затем иметь UIContainerView, который указывает на один и тот же UIViewController в каждом из базовых контроллеров представления.

...