Geralmente, o sistema deve lidar com a instanciação do controlador de exibição com um storyboard. O que você deseja é atravessar a hierarquia do viewController, pegando uma referência ao self.window.rootViewController
em vez de inicializar os controladores de exibição, que já devem ser inicializados corretamente se você configurou seu storyboard corretamente.
Então, digamos que você rootViewController
é um UINavigationController e, em seguida, você deseja enviar algo para o seu controlador de vista superior, faça o seguinte no AppDelegate didFinishLaunchingWithOptions
:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
Em Swift, se seria muito semelhante:
let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data
Você realmente não deve inicializar os controladores de exibição usando os IDs do storyboard do representante do aplicativo, a menos que queira ignorar a maneira normal como o storyboard é carregado e carregar o storyboard inteiro. Se você estiver tendo que inicializar cenas do AppDelegate, provavelmente está fazendo algo errado. Quero dizer, imagine que, por algum motivo, você deseja enviar dados para um controlador de exibição na pilha, o AppDelegate não deve estar chegando à pilha do controlador de exibição para definir dados. Isso não é da sua conta. Seu negócio é o rootViewController. Deixe o rootViewController manipular seus próprios filhos! Portanto, se eu estivesse ignorando o processo normal de carregamento de storyboard pelo sistema removendo referências a ele no arquivo info.plist, instanciaria no máximo o rootViewController usandoinstantiateViewControllerWithIdentifier:
e, possivelmente, sua raiz, se for um contêiner, como um UINavigationController. O que você deseja evitar é instanciar controladores de exibição que já foram instanciados pelo storyboard. Este é um problema que vejo muito. Em resumo, discordo da resposta aceita. Ele está incorreto, a menos que os pôsteres signifiquem remover o carregamento do storyboard do info.plist, pois você carregou 2 storyboards de outra forma, o que não faz sentido. Provavelmente não é um vazamento de memória porque o sistema inicializou a cena raiz e a atribuiu à janela, mas você apareceu e a instanciaram novamente e as atribuiu novamente. Seu aplicativo está com um péssimo começo!