Подтвердить что ты не робот

Совместное использование того же UIViewController как rootViewController с двумя UINavigationControllers

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

- (void)viewDidLoad
{
    [super viewDidLoad];

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

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