Итак, я выдвигаю контроллер представления из RootViewController как:
[self.navigationController pushViewController: еще один анимированный вид ViewController: ДА];
Но anotherViewController
теперь я хочу снова получить доступ к RootViewController.
я стараюсь
// (теперь внутри anotherViewController) /// RootViewController * root = (RootViewController *) self.parentViewController; // Нет. // ошибка RootViewController * root = (RootViewController *) [self.navigationController.viewControllers objectAtIndex: 0]; // ДА!! оно работает
Я не уверен, ПОЧЕМУ это работает, и я не уверен, что это лучший способ сделать это. Может кто-нибудь прокомментировать лучший способ получить RootViewController от контроллера, который вы вставили в навигационный контроллер этого RootViewController, и является ли способ, которым я это сделал, надежным или нет?
ios
iphone
uinavigationcontroller
bobobobo
источник
источник
Ответы:
Используйте свойство viewControllers UINavigationController. Пример кода:
Это стандартный способ получить «задний» вид контроллера. Причина в
objectAtIndex:0
том, что контроллер представления, к которому вы пытаетесь получить доступ, также является корневым, если бы вы были глубже в навигации, вид сзади не совпадал бы с корневым.источник
rootViewController
отсутствует*
, и индекс должен быть просто0
. Код в вопросе правильный:RootViewController *root = (RootViewController *)[navigationController.viewControllers objectAtIndex:0]
Swift версия:
Версия ObjectiveC:
Где self - это экземпляр UIViewController, встроенный в UINavigationController.
источник
Немного менее уродливая версия того же самого, упомянутого в почти всех этих ответах:
в вашем случае я бы, вероятно, сделал что-то вроде:
внутри вашего подкласса UINavigationController :
тогда вы можете использовать:
редактировать
ОП попросил недвижимость в комментариях.
если хотите, вы можете получить к нему доступ, например
self.navigationController.rootViewController
, просто добавив свойство readonly в свой заголовок:источник
Для всех, кто интересуется быстрым расширением, это то, что я сейчас использую:
источник
В дополнение к ответу @ dulgan , всегда полезно использовать
firstObject
overobjectAtIndex:0
, потому что, в то время как первый возвращает nil, если в массиве нет объектов, последний выдает исключение.Кроме того, было бы большим плюсом для вас создать категорию с именем
UINavigationController+Additions
и определить свой метод в этом.источник
Как насчет запроса синглтона UIApplication для его keyWindow , и из этого UIWindow запрашивать корневой контроллер представления (его свойство rootViewController ):
источник
Здесь я придумал универсальный способ навигации из любого места в root.
Вы создаете новый файл Class с этим классом, чтобы он был доступен из любого места в вашем проекте:
Использование из любой точки вашего проекта:
источник
Это сработало для меня:
Когда мой корневой контроллер представления встроен в контроллер навигации:
Помните, что
keyWindow
это устарело.источник