Referenciando variáveis ​​de instância AppDelegate

84

Eu tenho um projeto baseado no modelo de aplicativo baseado em navegação. No AppDelegate estão os métodos -applicationDidFinishLoading:e -applicationWillTerminate:. Nesses métodos, estou carregando e salvando os dados do aplicativo e armazenando-os em uma variável de instância (na verdade, é um gráfico-objeto).

Quando o aplicativo é carregado, ele carrega MainWindow.xib, que possui um NavigationConroller, que por sua vez possui um RootViewController. A nibNamepropriedade RootViewController aponta para RootView (minha classe de controlador real).

Em minha aula, desejo referir-me ao objeto que criei no -applicationDidFinishLoading:método, para poder obter uma referência a ele.

Alguém pode me dizer como fazer isso? Eu sei como fazer referência entre objetos que criei programaticamente, mas não consigo descobrir como voltar, visto que a etapa do meio foi feita de dentro do arquivo NIB.

Chris Hanson
fonte

Respostas:

204

Para variáveis ​​(geralmente a estrutura de dados do modelo) que preciso acessar em qualquer lugar no aplicativo, declare-as em sua classe AppDelegate. Quando você precisar fazer referência a ele:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 
leonho
fonte
7
Votei neste porque você adicionou o elenco, você precisa lançar AppDelegate para seu próprio tipo para que possa ver suas próprias propriedades que definiu. Você poderia editar para deixar isso mais claro, mas não transmitindo para "AppDelegate" ...
Kendall Helmstetter Gelner
Existe uma maneira de acessar o controlador de exibição raiz sem fazer referência ao nome do delegado do aplicativo ou a qualquer um de seus membros? (Eu gostaria de escrever algum código portátil que precisa do controlador de visualização raiz.)
SK9
SK9, todo aplicativo iOS precisa ter um appDelegate, então o código será portátil!
Daniel
16

Se eu entender sua pergunta, você deseja fazer referência a variáveis ​​/ propriedades de membro em seu objeto AppDelegate? A maneira mais simples é usar [[UIApplication sharedApplication] delegate] para retornar uma referência ao seu objeto.

Se você tem uma propriedade chamada window, pode fazer o seguinte:

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow
Ben Gottlieb
fonte
11

Aqui está uma alternativa portátil bem definida para iOS4.0 e superior:

UIApplication *myApplication = [UIApplication sharedApplication];
UIWindow *mainWindow = [myApplication keyWindow];
UIViewController *rootViewController = [mainWindow rootViewController];

ou, em uma linha,

UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];

Não se esqueça de definir a rootViewControllerpropriedade da janela (digamos em IB) ou isso fará o jack.

SK9
fonte
2

Defina uma macro e use-a em qualquer lugar!

#define appDelegateShared ((AppDelegate *)[UIApplication sharedApplication].delegate)

Em Meu Código: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
tryKuldeepTanwar
fonte