Defina programaticamente o controlador de exibição inicial usando Storyboards

252

Como defino programaticamente InitialViewControllerpara um Storyboard? Quero abrir meu storyboard para uma visualização diferente, dependendo de algumas condições que podem variar de lançamento para lançamento.

UserDev
fonte
1
Verifique esta resposta sem aviso, sem limpar o storyboard principal nas configurações.
Borzh

Respostas:

466

Como sem um controlador de exibição inicial fictício

Verifique se todos os controladores de exibição inicial têm um ID do Storyboard.

No storyboard, desmarque o atributo "É controlador de exibição inicial" no primeiro controlador de exibição.

Se você executar seu aplicativo neste momento, você lerá:

Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?

E você notará que sua propriedade de janela no delegado do aplicativo agora é nula.

Na configuração do aplicativo, acesse seu destino e a Infoguia. Limpe o valor de Main storyboard file base name. Na Generalguia, limpe o valor para Main Interface. Isso removerá o aviso.

Crie a janela e o controlador de exibição inicial desejado no application:didFinishLaunchingWithOptions:método do delegado do aplicativo :

- (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;
}
Travis
fonte
7
Ame! Ame! Ame! Usarei isso para alternar entre duas árvores de controladores de exibição completamente diferentes para IOS6 e IOS7. Parece a melhor maneira de lidar com a compatibilidade com versões anteriores, enquanto ainda usa todos os sinos e assobios no IOS7.
Hunkpapa
6
Estou aprendendo programação iOS no Swift. Alguém pode me ajudar como escrever o código acima rapidamente. por favor ajude. Obrigado.
Raghavendra
1
@bdv didFinishLaunchingWithOptionsé chamado quando o aplicativo é iniciado em um novo processo. Se você for para a tela inicial e retornar ao aplicativo, esse método não será chamado novamente. (A menos que o iOS termine devido a restrições de memória.) Tente parar o aplicativo e inicie novamente a partir do seu IDE. Se o problema persistir, publique o problema no SO e terei prazer em ajudar, amigo.
Travis
2
@ peyman De acordo com minha investigação, a janela não existe depois que a referência ao storyboard principal é removida. Comentei a instanciação da janela no meu projeto atual e achei que esse ainda era o caso.
Travis
2
@Raghav, aqui está o código swift:self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController: UIViewController = // self.window!.rootViewController = viewController self.window!.makeKeyAndVisible()
mjmayank
121

Para todos os amantes de Swift por aí, aqui está a resposta de @Travis traduzida para SWIFT :

Faça o que o @Travis explicou antes do código do Objective C. Então,

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var exampleViewController: ExampleViewController = mainStoryboard.instantiateViewControllerWithIdentifier("ExampleController") as! ExampleViewController

    self.window?.rootViewController = exampleViewController

    self.window?.makeKeyAndVisible()

    return true
}

O ExampleViewControllerseria o novo controlador de exibição inicial que você gostaria de mostrar.

Os passos explicados:

  1. Crie uma nova janela com o tamanho da janela atual e defina-a como nossa janela principal
  2. Instancie um storyboard que possamos usar para criar nosso novo controlador de exibição inicial
  3. Instancie nosso novo controlador de exibição inicial com base no seu Storyboard ID
  4. Defina o novo controlador de visualização raiz da nova janela como o novo controlador que acabamos de iniciar
  5. Tornar nossa nova janela visível

Aproveite e feliz programação!

Nome em Exibição
fonte
pedi a @Travis para esta versão e depois .... obrigado de qualquer maneira.
dellos 4/15
Storyboard ID está na seção de Identidade no painel Inspetor de Identidade
Dominic
2
Uma dica para não precisar do ID do storyboard é definir explicitamente o controlador de exibição inicial (rootViewController) no storyboard e usar o método de instância UIStoryboard.instantiateInitialViewController () para obter o controlador em vez de UIStoryboard.instantiateViewControllerWithIdentifier () proposto acima. O resto é o mesmo.
Eric Boumendil
45

Você pode definir programaticamente o rootViewController da janela da chave em (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

por exemplo:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (shouldShowAnotherViewControllerAsRoot) {
        UIStoryboard *storyboard = self.window.rootViewController.storyboard;
        UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"rootNavigationController"];
        self.window.rootViewController = rootViewController;
        [self.window makeKeyAndVisible];
    }

    return YES;
}
Chengjiong
fonte
Como iniciar o ponto de entrada original do UIViewController secundário?
Ooxio 3/08
@oxio: você pode armazenar o ponto de entrada original em um local global e usá-lo posteriormente.
Chengjiong 04/08/2015
isso é realmente útil se você quiser criar uma instância de login / registrar ou algo assim ...
Mel
Isso é muito mais direto do que a resposta de @ Travis acima, porque você não precisa mexer com um milhão de configurações de projeto e mexer no IB. Quem se importa se um de seus controladores de exibição for tecnicamente o VC inicial padrão e você desviar programaticamente para outro?
11119 Danny
Observe que o View Controller inicial substituído designado por storyboard ainda será instanciado e passará pelo ciclo init()/ deinit(), mas sem executar viewDidLoad()ou inicializar adequadamente IBOutlet-s. Verifique se o código está pronto para isso.
Gary
14

Swift 3: atualização para o código de @ victor-sigler

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)

    // Assuming your storyboard is named "Main"
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    // Add code here (e.g. if/else) to determine which view controller class (chooseViewControllerA or chooseViewControllerB) and storyboard ID (chooseStoryboardA or chooseStoryboardB) to send the user to

    if(condition){
        let initialViewController: chooseViewControllerA = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardA") as! chooseViewControllerA
        self.window?.rootViewController = initialViewController
    )
    }else{
        let initialViewController: chooseViewControllerB = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardB") as! chooseViewControllerB
        self.window?.rootViewController = initialViewController
    )

    self.window?.makeKeyAndVisible(

    return true
}
MEK
fonte
Obrigado, @MEK. Além disso, convém corrigir a sintaxe das instruções de fechamento condicionais substituindo os parênteses à direita por chaves.
Native_Mobile_Arch_Dev 20/02/19
9

Você pode definir o rootviewcontroller de Navegação como um controlador de vista principal. Essa ideia pode ser usada para login automático conforme os requisitos do aplicativo.

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];

UIViewController viewController = (HomeController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"HomeController"];

UINavigationController navController = [[UINavigationController alloc] initWithRootViewController:viewController];

 self.window.rootViewController = navController;

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {

    // do stuff for iOS 7 and newer

    navController.navigationBar.barTintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];

    navController.navigationItem.leftBarButtonItem.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];

    navController.navigationBar.tintColor = [UIColor whiteColor];

    navController.navigationItem.titleView.tintColor = [UIColor whiteColor];

    NSDictionary *titleAttributes =@{

                                     NSFontAttributeName :[UIFont fontWithName:@"Helvetica-Bold" size:14.0],

                                     NSForegroundColorAttributeName : [UIColor whiteColor]

                                     };

    navController.navigationBar.titleTextAttributes = titleAttributes;

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

}

else {

    // do stuff for older versions than iOS 7

    navController.navigationBar.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];



    navController.navigationItem.titleView.tintColor = [UIColor whiteColor];

}

[self.window makeKeyAndVisible];

Para usuários do StoryboardSegue

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];

// Go to Login Screen of story board with Identifier name : LoginViewController_Identifier

LoginViewController *loginViewController = (LoginViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@“LoginViewController_Identifier”];

navigationController = [[UINavigationController alloc] initWithRootViewController:testViewController];

self.window.rootViewController = navigationController;

[self.window makeKeyAndVisible];

// Go To Main screen if you are already Logged In Just check your saving credential here

if([SavedpreferenceForLogin] > 0){
    [loginViewController performSegueWithIdentifier:@"mainview_action" sender:nil];
}

obrigado

Bhavsar1311
fonte
6

Abra o mainstoryboard, selecione a visualização que deseja iniciar primeiro e abra Utilitários -> Atributos. Abaixo do "View Controller", você vê o botão de opção "Is initial View Controller". Apenas selecione.

--- À pergunta revisada:

Pode ser que você possa tentar o seguinte: escreva um método na seção ViewDidLoad da visualização inicial e, quando o método for executado no início do aplicativo, o método dispara um segue para outra visualização.

m.etka
fonte
Eu escrevi o método no ViewDidLoad, mas ele não funcionou e quando o escrevi no viewdidAppear está funcionando, você pode explicar por que isso está acontecendo?
UserDev
Pode ser que você tente o seguinte: Adicione um código segue de acordo com suas condições a um dos métodos apropriados no arquivo appDelegate.m. Por exemplo, você pode adicionar um código segue ao método "applicationDidBecomeActive:".
m.etka
@Jagdev, você escreve no ViewDidAppear em vez de no ViewDidLoad.
Umair Khan Jadoon
O problema dessa abordagem é que o controlador de exibição inicial aparece se torna visível por algum tempo e depois muda para outro que não é bom do ponto de vista do UX, portanto não é uma boa solução.
vishal dharankar
3

SWIFT 5

Se você não tiver um ViewController definido como o ViewController inicial no storyboard, precisará fazer duas coisas:

  1. Vá para o seu projeto TARGETS, selecione seu projeto -> Geral -> Limpe o campo Main Interface.
  2. Sempre dentro do projeto TARGETS, agora vá para Info -> Application Scene Manifest -> Configuration Scene -> Application Session Role -> Item0 (Configuração padrão) -> exclua o campo do nome do storyboard.

Finalmente, agora você pode adicionar seu código no SceneDelegate:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    guard let windowScene = (scene as? UIWindowScene) else { return }

    window = UIWindow(windowScene: windowScene)


    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    // Make sure you set an Storyboard ID for the view controller you want to instantiate
    window?.rootViewController = storyboard.instantiateViewController(withIdentifier: identifier)
    window?.makeKeyAndVisible()

}
rs7
fonte
Essa é certamente a resposta mais atual a partir do Xcode 11.5 e, de fato, corrigiu o Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not setaviso que eu estava tendo depois de decidir instanciar meu VC inicial no código. Um ponto importante, quando @ rs7 diz "excluir o campo de nome do storyboard", significa a linha inteira da lista, não apenas o conteúdo do próprio campo.
cdf1982 21/06
2

Eu não acho que é possível. Em vez disso, você pode ter um controlador inicial que terá sequências para diferentes controladores de exibição. Na inicialização, você pode decidir quais segue executar programaticamente.

Shmidt
fonte
2

Você pode definir o initial view controlleruso do Interface Builder e de forma programática.

Abaixo está a abordagem usada para programaticamente.

Objetivo-C:

        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"]; // <storyboard id>

        self.window.rootViewController = viewController;
        [self.window makeKeyAndVisible];

        return YES;

Rápido :

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

        var objMainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainController") as! MainViewController

        self.window?.rootViewController = objMainViewController

        self.window?.makeKeyAndVisible()

        return true
Jayprakash Dubey
fonte
2

Criei uma classe de roteamento para lidar com a navegação dinâmica e manter a classe AppDelegate limpa, espero que ajude a outros também.

//
//  Routing.swift
// 
//
//  Created by Varun Naharia on 02/02/17.
//  Copyright © 2017 TechNaharia. All rights reserved.
//

import Foundation
import UIKit
import CoreLocation

class Routing {

    class func decideInitialViewController(window:UIWindow){
        let userDefaults = UserDefaults.standard
        if((Routing.getUserDefault("isFirstRun")) == nil)
        {
            Routing.setAnimatedAsInitialViewContoller(window: window)
        }
        else if((userDefaults.object(forKey: "User")) != nil)
        {
            Routing.setHomeAsInitialViewContoller(window: window)
        }
        else
        {
            Routing.setLoginAsInitialViewContoller(window: window)
        }

    }

    class func setAnimatedAsInitialViewContoller(window:UIWindow) {
        Routing.setUserDefault("Yes", KeyToSave: "isFirstRun")
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let animatedViewController: AnimatedViewController = mainStoryboard.instantiateViewController(withIdentifier: "AnimatedViewController") as! AnimatedViewController

        window.rootViewController = animatedViewController
        window.makeKeyAndVisible()
    }

    class func setHomeAsInitialViewContoller(window:UIWindow) {
        let userDefaults = UserDefaults.standard
        let decoded  = userDefaults.object(forKey: "User") as! Data
        User.currentUser = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! User

        if(User.currentUser.userId != nil && User.currentUser.userId != "")
        {
            let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let homeViewController: HomeViewController = mainStoryboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
            let loginViewController: UINavigationController = mainStoryboard.instantiateViewController(withIdentifier: "LoginNavigationViewController") as! UINavigationController
            loginViewController.viewControllers.append(homeViewController)
            window.rootViewController = loginViewController
        }
        window.makeKeyAndVisible()
    }

    class func setLoginAsInitialViewContoller(window:UIWindow) {
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let loginViewController: UINavigationController = mainStoryboard.instantiateViewController(withIdentifier: "LoginNavigationViewController") as! UINavigationController

        window.rootViewController = loginViewController
        window.makeKeyAndVisible()
    }

  class func setUserDefault(_ ObjectToSave : Any?  , KeyToSave : String)
    {
        let defaults = UserDefaults.standard

        if (ObjectToSave != nil)
        {

            defaults.set(ObjectToSave, forKey: KeyToSave)
        }

        UserDefaults.standard.synchronize()
    }

    class func getUserDefault(_ KeyToReturnValye : String) -> Any?
    {
        let defaults = UserDefaults.standard

        if let name = defaults.value(forKey: KeyToReturnValye)
        {
            return name as Any
        }
        return nil
    }

    class func removetUserDefault(_ KeyToRemove : String)
    {
        let defaults = UserDefaults.standard
        defaults.removeObject(forKey: KeyToRemove)
        UserDefaults.standard.synchronize()
    }

}

E no seu AppDelegate, chame isso

 self.window = UIWindow(frame: UIScreen.main.bounds)
 Routing.decideInitialViewController(window: self.window!)
Varun Naharia
fonte
2

Outra solução com o uso do Swift 3 e Swift 4 com a prevenção de vazamento de força é assim

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    guard let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewController") as? YourViewController else {
        return false
    }
    self.window?.rootViewController = viewController
    self.window?.makeKeyAndVisible()
    return true
}

E abaixo está usando com UINavigationController

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    guard let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewController") as? YourViewController else {
        return false
    }
    let navigationController = UINavigationController(rootViewController: viewController)
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()
    return true
}
abdullahselek
fonte
2

Em AppDelegate.swiftvocê pode adicionar o seguinte código:

let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "YourViewController_StorboardID")
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()

Obviamente, você precisa implementar sua lógica, com base em quais critérios você escolherá um controlador de exibição apropriado.

Além disso, não esqueça de adicionar uma identidade (selecione storyboard -> Cena do controlador -> Mostrar o inspetor de identidade -> atribua o StorboardID).

Nedim Talovic
fonte
1

RESPOSTA ATUALIZADA para iOS 13 e delegado de cena:

certifique-se de que no arquivo info.plist vá para Application Scene Manifest -> Configuration Scene -> Application Session Role -> Item 0 e exclua a referência ao storyboard principal também. Caso contrário, você receberá o mesmo aviso sobre a falha na instanciação do storyboard.

Além disso, mova o código do aplicativo delegado para a cena delegate method scene (_: willConnectTo: options :), pois é aqui que os eventos do ciclo de vida são tratados agora.

bze12
fonte
0

Alguns dias atrás eu encontrei a mesma situação. Um truque muito simples resolveu esse problema. Defino oculto meu controlador de exibição inicial antes do lançamento2. Se o controlador de exibição inicial for o controlador certo, ele será definido como visível em viewDidLoad. Senão, uma sequência é executada no controlador de visualização desejado. Funciona perfeitamente no iOS 6.1 e superior. Tenho certeza que funciona em versões anteriores do iOS.

m.etka
fonte
0

Agradecemos a modificação da seguinte maneira no AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) ->     Bool {
//Some code to check value of pins

if pins! == "Verified"{
        print(pins)
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "HomePage", bundle: nil)
        let exampleViewController: UINavigationController = mainStoryboard.instantiateViewControllerWithIdentifier("SBHP") as! UINavigationController

        self.window?.rootViewController = exampleViewController

        self.window?.makeKeyAndVisible()
    }else{
        print(pins)
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let exampleViewController: UINavigationController = mainStoryboard.instantiateViewControllerWithIdentifier("SBUser") as! UINavigationController

        self.window?.rootViewController = exampleViewController

        self.window?.makeKeyAndVisible()
    }
Jeremy
fonte
0

Solução simples encontrada - não é necessário remover a "verificação inicial do controlador de exibição" do storyboard e editar a guia Informações do projeto e usar makeKeyAndVisible, basta colocar

self.window.rootViewController = rootVC;

no

- (BOOL) application:didFinishLaunchingWithOptions:
alex1704
fonte
Mas você ainda tem rootVCde instantiateViewControllerWithIdentifier, correto?
Thomers 11/10
0
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = mainStoryboard.instantiateViewController(withIdentifier: "storyBoardid") as! ViewController
let navigationController = UINavigationController(rootViewController: vc)
UIApplication.shared.delegate.window?.rootViewController = navigationController

Outra maneira é apresentar o viewController,

let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = mainStoryboard.instantiateViewController(withIdentifier: "storyBoardid") as! ViewController
self.present(vc,animated:true,completion:nil)

Primeiro, você precisa criar o objeto do seu storyboard, depois alterar o root (se necessário) e, em seguida, fazer referência a um controlador de exibição específico que é acionado pelo controlador de exibição atual (se você alterar o root); caso contrário, é apenas um novo controlador de exibição que pode ser usado.

VD Purohit
fonte
@VD Purohit, você pode descrever mais sobre sua resposta para obter mais entendimento.
Prags
0

Swift 4, Xcode 9

no arquivo AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let firstVC = storyboard.instantiateViewController(withIdentifier: "firstViewController") as! firstViewController
    self.window?.rootViewController = firstVC
}
Shan Ye
fonte
0
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        self.window = UIWindow(frame: UIScreen.main.bounds)
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        if (PreferenceHelper.getAccessToken() != "") {
            let initialViewController = storyboard.instantiateViewController(withIdentifier: "your View Controller Identifier")
            self.window?.rootViewController = initialViewController
        } else {
            let initialViewController = storyboard.instantiateViewController(withIdentifier: "your View Controller identifier")
            self.window?.rootViewController = initialViewController
        }
        self.window?.makeKeyAndVisible()
        return true
    }

/*
use your view Controller identifier must use it doubles quotes**strong text**
Charles
fonte
verific em padrões nsuser preferências de valor Valor Completly armazenados e verificar Condição on tendo em vista intial Controlador Problema
charles
0

Swift 5 ou acima # faz o controlador de exibição de rota por este código simples. Se você estiver usando o xcode 11 ou superior, inicialize primeiro var window: UIWindow?no AppDelegate

let rootVC = mainStoryboard.instantiateViewController(withIdentifier: "YOURCONTROLLER") as! YOURCONTROLLER

        navigationController.setNavigationBarHidden(true, animated: true)
        UIApplication.shared.windows.first?.rootViewController = UINavigationController.init(rootViewController: rootVC)
        UIApplication.shared.windows.first?.makeKeyAndVisible()
Rohit Nishad
fonte
0

Se você preferir não alterar applicationDidFinish, execute o seguinte truque:

Defina o controlador de Navegação como um controlador de exibição inicial e atribua a ele uma classe personalizada 'MyNavigationController'. Em seguida, você pode ajustar seu controlador de visualização raiz durante o viewDidLoad - ele substituirá o controlador de visualização raiz que você definiu no seu storyboard.

class MyNavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        if !isLoggedIn() {
            viewControllers = [R.storyboard.authentication.loginView()!]
        }
    }

    private func isLoggedIn() -> Bool {
        return false
    }

}
Kamen Dobrev
fonte
-3

Selecione o controlador de exibição que você deseja abrir primeiro e vá para o Inspetor de Atributos. Vá para a cena inicial e verifique a opção inicial do controlador de exibição.

Agora, este será o seu controlador de exibição inicial que abrirá primeiro quando o aplicativo for iniciado.

iMash
fonte