Então, eu envio um controlador de exibição do RootViewController como:
[self.navigationController pushViewController: outroViewController animado: YES];
MAS, a partir de anotherViewController
agora, quero acessar o RootViewController novamente.
estou tentando
// (dentro de outroViewController agora) /// RootViewController * root = (RootViewController *) self.parentViewController; // Não. // err RootViewController * root = (RootViewController *) [self.navigationController.viewControllers objectAtIndex: 0]; // SIM!! funciona
Não sei por que isso funciona e não tenho certeza se é a melhor maneira de fazê-lo. Alguém pode comentar sobre uma maneira melhor de obter o RootViewController de um controlador que você inseriu no navegador de navegação do RootViewController e se a maneira como eu fiz isso é confiável ou não?
ios
iphone
uinavigationcontroller
bobobobo
fonte
fonte
Respostas:
Use a propriedade viewControllers do UINavigationController. Código de exemplo:
Essa é a maneira padrão de obter o controlador de exibição "traseiro". O motivo
objectAtIndex:0
é que o controlador de visualização que você está tentando acessar também é o raiz; se você estivesse mais aprofundado na navegação, a visualização traseira não seria a mesma que a visualização raiz.fonte
rootViewController
está faltando*
antes, e o índice deveria estar0
. O código da pergunta está correto:RootViewController *root = (RootViewController *)[navigationController.viewControllers objectAtIndex:0]
Versão rápida:
Versão ObjectiveC:
Onde self é uma instância de um UIViewController incorporado em um UINavigationController.
fonte
Uma versão um pouco menos feia da mesma coisa mencionada em praticamente todas essas respostas:
no seu caso, eu provavelmente faria algo como:
dentro de sua subclasse UINavigationController :
então você pode usar:
editar
O OP pediu uma propriedade nos comentários.
se quiser, você pode acessá-lo por meio de algo como
self.navigationController.rootViewController
apenas adicionando uma propriedade somente leitura ao seu cabeçalho:fonte
Para todos os interessados em uma extensão rápida, é isso que estou usando agora:
fonte
Como complemento à resposta de @ dulgan , é sempre uma boa abordagem usar
firstObject
demaisobjectAtIndex:0
, porque, enquanto o primeiro retorna nulo se não houver objeto na matriz, o último gera uma exceção.Como alternativa, seria uma grande vantagem para você criar uma categoria nomeada
UINavigationController+Additions
e definir seu método nela .fonte
Que tal pedir ao UIApplication singleton sua keyWindow e, a partir dessa UIWindow, solicitar o controlador de exibição raiz (sua propriedade rootViewController ):
fonte
Aqui eu vim com o método universal para navegar de qualquer lugar até a raiz.
Você cria um novo arquivo de classe com essa classe, para que seja acessível de qualquer lugar do seu projeto:
Uso de qualquer lugar do seu projeto:
fonte
Isso funcionou para mim:
Quando meu controlador de visualização raiz está incorporado em um controlador de navegação:
Lembre-se de que
keyWindow
está obsoleto.fonte