Gostaria de definir o viewcontroller inicial no appdelegate. Encontrei uma resposta muito boa, mas está no Objetivo C e estou tendo problemas para conseguir a mesma coisa rapidamente.
Defina programaticamente o controlador de exibição inicial usando Storyboards
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *viewController = // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
return YES;
}
Alguém pode ajudar?
Eu quero que o Viewcontroller inicial seja dependente de determinadas condições serem atendidas usando uma instrução condicional.
Respostas:
Eu usei este tópico para me ajudar a converter o objetivo C em rápido, e está funcionando perfeitamente.
Instanciar e apresentar uma viewController no Swift
Código Swift 2 :
Código Swift 3 :
fonte
UIWindow
e definir seu controlador de exibição raiz programaticamente.Tente isso. Por exemplo: Você deve usar
UINavigationController
como controlador de exibição inicial. Em seguida, você pode definir qualquer controlador de exibição como root no storyboard.Veja minha tela de storyboard.
fonte
Para Swift 3, Swift 4:
Instancie o controlador de visualização raiz do storyboard:
Se você deseja usar
UINavigationController
como root:Instancie o controlador de visualização raiz do xib:
É quase o mesmo, mas em vez de linhas
você terá que escrever
fonte
se você não estiver usando o storyboard, tente isso
fonte
Para o novo Xcode 11.xxx e Swift 5.xx, em que o destino foi definido para iOS 13+.
Para a nova estrutura do projeto, o AppDelegate não precisa fazer nada em relação ao rootViewController.
Existe uma nova classe para manipular a classe window (UIWindowScene) -> arquivo 'SceneDelegate'.
fonte
Aqui está uma boa maneira de abordá-lo. Este exemplo coloca um controlador de navegação como o controlador de visualização raiz e coloca o controlador de visualização de sua escolha na parte inferior da pilha de navegação, pronto para você enviar o que você precisar.
Para que este exemplo funcione, defina "MainViewController" como o ID do Storyboard no seu controlador de exibição principal, e o nome do arquivo do storyboard nesse caso seria "MainStoryboard.storyboard". Renomeio meus storyboards dessa maneira porque Main.storyboard para mim não é um nome adequado, principalmente se você for subclassificá-lo.
fonte
eu tinha feito isso no objetivo-c espero que seja útil para você
fonte
Código para Swift 4.2 e 5:
E para
Xcode 11+
and for Swift 5+
:fonte
var window: UIWindow?
.And for Xcode 11+ and for Swift 5+
parte me ajuda muito. obrigado caraEu tinha feito no Xcode 8 e no swift 3.0 espero que seja útil para você, e está funcionando perfeitamente. Use o seguinte código:
E se você estiver usando o controlador de navegação, use o seguinte código para isso:
fonte
Swift 4:
Adicione essas linhas dentro de AppDelegate.swift, dentro da função didFinishLaunchingWithOptions () ...
Agora, por exemplo, muitas vezes fazemos algo assim quando queremos direcionar o usuário para uma tela de login ou para uma tela de configuração inicial ou para a tela principal do aplicativo etc. Se você também quiser fazer algo assim , você pode usar esse ponto como uma bifurcação na estrada para isso.
Pense nisso. Você poderia ter um valor armazenado em NSUserDefaults, por exemplo, que continha um userLoggedIn Boolean e
if userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }
fonte
Bem, todas as respostas acima / abaixo estão produzindo um aviso sobre nenhum ponto de entrada no storyboard.
Se você deseja ter 2 (ou mais) controladores de vista de entrada que dependem de alguma condição (por exemplo, conditionVariable ), o que você deve fazer é:
Use o próximo código:
Espero que isto ajude.
fonte
Se você não estiver usando o storyboard. Você pode inicializar seu controlador de exibição principal programaticamente.
Swift 4
E também remova
Main
das Informações de implantação .fonte
Aqui está a solução completa no Swift 4 implementa isso em didFinishLaunchingWithOptions
escreva esta função em qualquer lugar dentro do Appdelegate.swift
fonte
Apenas no caso de você querer fazer isso no controlador de exibição e não no delegado do aplicativo: basta buscar a referência ao AppDelegate no seu controlador de exibição e redefinir seu objeto de janela com o controlador de exibição correto, como rootviewController.
fonte
Para o veloz 4.0 .
No seu arquivo AppDelegate.swift no método didfinishedlaunchingWithOptions , coloque o seguinte código.
Espero que funcione bem.
fonte
Swift 5 e Xcode 11
Portanto, no xCode 11, a solução da janela não é mais válida dentro do appDelegate. Eles mudaram isso para o SceneDelgate. Você pode encontrar isso no arquivo SceneDelgate.swift.
Você notará que agora tem um
var window: UIWindow?
presente.Na minha situação, eu estava usando um TabBarController de um storyboard e queria defini-lo como rootViewController.
Este é o meu código:
sceneDelegate.swift
Adicione isso ao método de cena correto, como fiz aqui. Observe que você precisará definir o nome do identificador para o tabBarController ou viewController que você está usando no storyboard.
No meu caso, eu estava fazendo isso para definir um stateController para acompanhar as variáveis compartilhadas entre as visualizações de guia. Se você deseja fazer o mesmo, adicione o seguinte código ...
StateController.swift
Nota: Apenas use suas próprias variáveis ou o que você está tentando acompanhar, apenas listei o meu como um exemplo na estrutura tdfvariables.
Em cada visualização do TabController, adicione a seguinte variável de membro.
Em seguida, nesses mesmos arquivos, adicione o seguinte:
O que isso faz é permitir que você evite a abordagem de singleton para passar variáveis entre as visualizações. Isso permite facilmente o modelo de injeção de dependência, que é muito melhor a longo prazo do que a abordagem singleton.
fonte
Desativar
Main.storyboard
Adicionar ID do Storyboard
Swift 5 e Xcode 11
Ampliar
UIWindow
Edição gerada pelo Xcode
SceneDelegate.swift
fonte
fonte
fonte
Abra um viewcontroller com o delegado SWRevealViewController From App.
fonte
Para Swift 5+
fonte