Доступ к контроллеру представления из appdelegate с помощью раскадровки

Я следовал этому учебнику Рэя Венделиха RayWenderlichTutorial Tabbarcontroller с использованием раскадровки< /а>

Просто посмотрите изображение раскадровки. Рэй получает доступ к «playersViewcontroller, используя приведенный ниже код»

 UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
UINavigationController *navigationController = [tabBarController viewControllers][0];
PlayersViewController *playersViewController = [navigationController viewControllers][0];

Когда я пытаюсь получить доступ к playerDetailsViewController, используя следующий код, я получаю сбой. Сообщение

Ratings[2630:60b] * Завершение работы приложения из-за необработанного исключения 'NSRangeException', причина: '* -[__NSArrayI objectAtIndex:]: индекс 1 за пределами [0 .. 0]' *** Первый бросить стек вызовов: (0x30b49e83 0x3aea66c7 0x30a7fff9 0x3ddd1 0x3333eaad 0x3333e4f3 0x33338b41 0x332d3a07 0x332d2cfd 0x33338321 0x357b876d 0x357b8357 0x30b14777 0x30b14713 0x30b12edf 0x30a7d471 0x30a7d253 0x333375c3 0x33332845 0x3e0fd 0x3b39fab7) Libc ++ abi.dylib: оканчивающиеся неперехваченного исключением типа NSException

код

UITabBarController *tabBarController =
(UITabBarController *)self.window.rootViewController;
UINavigationController *navigationController =
[[tabBarController viewControllers] objectAtIndex:0];
PlayersViewController *playersViewController =
[[navigationController viewControllers] objectAtIndex:0];

UINavigationController *nav=[[navigationController viewControllers]objectAtIndex:1];
PlayerDetailsViewController *playerdetailsviewcontroller=[[nav viewControllers]objectAtIndex:0];

Я также попробовал приведенный ниже код,

UITabBarController *tabBarController =
(UITabBarController *)self.window.rootViewController;
UINavigationController *navigationController =
[[tabBarController viewControllers] objectAtIndex:0];
PlayersViewController *playersViewController =
[[navigationController viewControllers] objectAtIndex:0];
PlayerDetailsViewController *playerdetailsviewcontroller=[[navigationController viewControllers]objectAtIndex:1];

где я получаю сбой с сообщением

'NSRangeException', причина: '*** -[__NSArrayI objectAtIndex:]: индекс 1 выходит за пределы [0 .. 0]'

Изображение раскадровки введите здесь описание изображения

В основном я хочу получить доступ к PlayerdetailsViewcontroller из appdelegate. Я думаю, что я что-то упускаю, есть мысли?


person Suraj K Thomas    schedule 27.01.2014    source источник
comment
Не могли бы вы выложить скрин вашей раскадровки? Или дополнительную информацию о том, что вы сделали со своей раскадровкой. Тогда я постараюсь ответить на ваш вопрос   -  person Zhans    schedule 27.01.2014
comment
я отредактировал вопрос, если вы немного увеличите масштаб, вы увидите имена контроллеров просмотра   -  person Suraj K Thomas    schedule 27.01.2014


Ответы (2)


Ваше приложение аварийно завершает работу здесь (objectAtIndex:1):

UINavigationController *nav = [[navigationController viewControllers] objectAtIndex:1];
PlayerDetailsViewController *playerdetailsviewcontroller = [[nav viewControllers]objectAtIndex:0];

Это происходит потому, что naviationController имеет только 1 подвид (PlayersViewController). Вы не можете пройти дальше по раскадровке, не создав экземпляр PlayerDetailsViewController внутри PlayersViewController через переход.

EDIT Вы можете получить доступ только к ViewControllers, которые изначально видны (через UITabBarController).

Я также не понимаю, почему вы добавляете еще одну UINavigationController к PlayersViewController. Если вы соедините PlayersViewController с PlayerDetailViewController с помощью Segue, navigationController будет повторно использоваться (это будет правильный способ сделать это).

person Hannes    schedule 27.01.2014
comment
Есть ли способ получить доступ к контроллеру представления, если я сделаю то, что вы сказали? - person Suraj K Thomas; 28.01.2014
comment
да, вы можете получить к нему доступ через PlayersViewController, а также передавать данные с вашего AppDelegate на PlayersViewController и на PlayerDetailsViewController - person Hannes; 28.01.2014
comment
да, я решил это, используя то, что сказал Ханнес, получил доступ к нему через playerViewController вместо делегата приложения. UJSed готовится к методу Segue - person Suraj K Thomas; 28.01.2014
comment
Есть ли способ получить доступ к playerDeatailsViewcontroller из делегата приложения, если я подключил playerViewController и playerDetailsViewcontroller с помощью перехода? Я хочу получить доступ из делегата приложения. - person Suraj K Thomas; 31.01.2014

Похоже, у вас есть модальный переход от Players к Player Details. Таким образом, вы можете использовать свойство PresentViewController PlayersViewController, что-то вроде этого

PlayersViewController *playersViewController = [navigationController.viewControllers firstObject];
UINavigationController *secondNavigationController = playersViewController.presentedViewController;
PlayerDetailsViewController *playerDetailsViewController = [secondNavigationController.viewControllers firstObject];
person Jerry    schedule 31.01.2014