Eu tenho um storyboard configurado com login funcional e controlador de visualização principal, o último é o controlador de visualização para o qual o usuário é navegado quando o login é bem-sucedido. Meu objetivo é mostrar o controlador de visualização principal imediatamente se a autenticação (armazenada no keychain) for bem-sucedida e mostrar o controlador de visualização de login se a autenticação falhar. Basicamente, quero fazer isso no meu AppDelegate:
// url request & response work fine, assume success is a BOOL here
// that indicates whether login was successful or not
if (success) {
// 'push' main view controller
} else {
// 'push' login view controller
}
Eu sei sobre o método performSegueWithIdentifier: mas este método é um método de instância de UIViewController, portanto, não pode ser chamado de dentro de AppDelegate. Como faço isso usando meu storyboard existente?
EDITAR:
O controlador de visualização inicial do Storyboard agora é um controlador de navegação que não está conectado a nada. Usei setRootViewController: distinção porque MainIdentifier é um UITabBarController. Então é assim que minhas linhas se parecem:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
BOOL isLoggedIn = ...; // got from server response
NSString *segueId = isLoggedIn ? @"MainIdentifier" : @"LoginIdentifier";
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
UIViewController *initViewController = [storyboard instantiateViewControllerWithIdentifier:segueId];
if (isLoggedIn) {
[self.window setRootViewController:initViewController];
} else {
[(UINavigationController *)self.window.rootViewController pushViewController:initViewController animated:NO];
}
return YES;
}
Sugestões / melhorias são bem-vindas!
[[self window] makeKeyAndVisible]
em aplicativo: didFinishLaunchingWithOptions: antes de tentar realizar as segues condicionais. UIApplicationMain () deve enviar a mensagem makeKeyAndVisible, mas o faz somente após didFinish ... Options: terminar. Procure "Coordenando esforços entre controladores de visualização" nos documentos da Apple para obter detalhes.Estou surpreso com algumas das soluções sugeridas aqui.
Não há realmente nenhuma necessidade de controladores de navegação fictícios em seu storyboard, ocultando visualizações e disparando segues em viewDidAppear: ou quaisquer outros hacks.
Se você não tiver o storyboard configurado em seu arquivo plist, deve criar você mesmo a janela e o controlador de visualização raiz :
Se o storyboard estiver configurado no plist do aplicativo, a janela e o controlador de visualização raiz já estarão configurados no momento em que o aplicativo: didFinishLaunching: for chamado e makeKeyAndVisible será chamado na janela para você.
Nesse caso, é ainda mais simples:
fonte
SE o ponto de entrada do seu storyboard não for
UINavigationController
:SE o ponto de entrada do seu storyboard FOR uma
UINavigationController
substituição:com:
fonte
appHasLaunchedOnce ? secondViewControllerIdentifier : firstViewControllerIdentifier;
No
application:didFinishLaunchingWithOptions
método do AppDelegate , antes dareturn YES
linha, adicione:Substitua
YourStartingViewController
pelo nome da sua classe de controlador de primeira visualização real (aquela que você não quer que apareça necessariamente) eYourSegueIdentifier
pelo nome real do segue entre aquele controlador inicial e aquele em que você deseja realmente iniciar (aquele após o segue )Envolva esse código em uma
if
condicional se você não quiser que isso aconteça sempre.fonte
Dado que você já está usando um Storyboard, você pode usá-lo para apresentar ao usuário o MyViewController, um controlador personalizado ( resumindo a resposta seguinte ).
Em AppDelegate.m :
A string passada para instantiateViewControllerWithIdentifier refere-se ao ID do Storyboard, que pode ser definido no construtor de interface:
Basta envolver isso na lógica conforme necessário.
Se você está começando com um UINavigationController, entretanto, esta abordagem não fornecerá controles de navegação.
Para 'avançar' a partir do ponto de partida de um controlador de navegação configurado através do construtor de interface, use esta abordagem:
fonte
Por que não ter a tela de login que aparece primeiro, verificar se o usuário já está logado e avançar para a próxima tela imediatamente? Tudo no ViewDidLoad.
fonte
Implementação rápida do mesmo:
Se você usar
UINavigationController
como ponto de entrada no storyboardfonte
Esta é a solução que funcionou no iOS7. Para acelerar o carregamento inicial e não fazer nenhum carregamento desnecessário, tenho um controlador UIView completamente vazio chamado "DUMMY" em meu arquivo Storyboard. Então posso usar o seguinte código:
fonte
Eu sugiro criar um novo MainViewController que seja o Root View Controller do Navigation Controller. Para fazer isso, basta segurar o controle e arrastar a conexão entre o Controlador de navegação e o MainViewController e escolher 'Relacionamento - Controlador de visualização raiz' no prompt.
Em MainViewController:
Lembre-se de criar segues entre MainViewController com os controladores de visualização Home e Login. Espero que isto ajude. :)
fonte
Depois de tentar vários métodos diferentes, consegui resolver este problema com este:
fonte