definir o viewcontroller inicial no appdelegate - swift

147

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.

Abubakar Moallim
fonte
Esta é uma possível duplicata de: stackoverflow.com/questions/10428629/…
Honey

Respostas:

279

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 :

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("LoginSignupVC")

    self.window?.rootViewController = initialViewController
    self.window?.makeKeyAndVisible()

    return true
}

Código Swift 3 :

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

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let initialViewController = storyboard.instantiateViewController(withIdentifier: "LoginSignupVC")

    self.window?.rootViewController = initialViewController
    self.window?.makeKeyAndVisible()

    return true
}
Abubakar Moallim
fonte
1
não consigo encontrar o storyboard "Principal" nem o "Storyboard.storyboard" no aplicativo swift 2
Async-
5
Essa é a maneira padrão atual de definir o controlador de exibição inicial no appdelegate ? Eu pergunto, porque parece um pouco de um hack (desculpe @Abs).
rigdonmr
10
@rigdonmr Se o aplicativo tiver um Storyboard definido como a Interface principal, a janela será carregada automaticamente e seu controlador de exibição raiz será definido como o controlador de exibição inicial do storyboard. Se o controlador de exibição precisar mudar com base em uma condição ou o aplicativo não tiver uma interface principal, é aceitável inicializar a UIWindowe definir seu controlador de exibição raiz programaticamente.
JAL
2
O surpreendente (mas bom) aqui é que instanciar o controlador de exibição manualmente dessa maneira parece impedir o iOS de instanciar o controlador de exibição padrão. Eu poderia ter esperado que ambos fossem carregados. Esse comportamento está documentado em algum lugar?
Pat Niemeyer
2
@MayankJain esta multa trabalha com Swift 3, apenas a necessidade de traduzir alguns dos códigos de rápida anteriormente
JAB
42

Tente isso. Por exemplo: Você deve usar UINavigationControllercomo controlador de exibição inicial. Em seguida, você pode definir qualquer controlador de exibição como root no storyboard.

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    let storyboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let navigationController:UINavigationController = storyboard.instantiateInitialViewController() as UINavigationController
    let rootViewController:UIViewController = storyboard.instantiateViewControllerWithIdentifier("VC") as UIViewController
    navigationController.viewControllers = [rootViewController]
    self.window?.rootViewController = navigationController
    return true
}

Veja minha tela de storyboard.

protikhonoff
fonte
Você definiu o Storyboard ID para visualizar o controlador no storyboard? Veja joxi.ru/l2ZYxZqS8JOomJ
protikhonoff
Sim, já está definido, acho que está abrindo com sucesso os controladores de exibição, mas não está 'mostrando'. Alguma ideia?
Abubakar Moallim 5/11
Sem erros, após o lançamento da tela, recebo uma página em preto
Abubakar Moallim 5/14
Acho que encontrei o problema. Você deve marcar "Is Initial View Controller" no seu storyboard. joxi.ru/8AnNbQlhq3QOAO
protikhonoff 5/11/14
mas quero alterar o viewcontroller inicial usando uma instrução condicional.
Abubakar Moallim 5/11
24

Para Swift 3, Swift 4:

Instancie o controlador de visualização raiz do storyboard:

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

        // In project directory storyboard looks like Main.storyboard,
        // you should use only part before ".storyboard" as it's name,
        // so in this example name is "Main".
        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)

        // controller identifier sets up in storyboard utilities
        // panel (on the right), it called Storyboard ID
        let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController

        self.window?.rootViewController = viewController
        self.window?.makeKeyAndVisible()        
        return true
    }

Se você deseja usar UINavigationControllercomo root:

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

        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController
        let navigationController = UINavigationController.init(rootViewController: viewController)
        self.window?.rootViewController = navigationController

        self.window?.makeKeyAndVisible()        
        return true
    }

Instancie o controlador de visualização raiz do xib:

É quase o mesmo, mas em vez de linhas

let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController

você terá que escrever

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)
Eridana
fonte
22

se você não estiver usando o storyboard, tente isso

var window: UIWindow?
var initialViewController :UIViewController?

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

    initialViewController  = MainViewController(nibName:"MainViewController",bundle:nil)

    let frame = UIScreen.mainScreen().bounds
    window = UIWindow(frame: frame)

    window!.rootViewController = initialViewController
    window!.makeKeyAndVisible()

    return true
}
Jibin Jose
fonte
1
a que o nome da ponta se refere?
Abubakar Moallim 5/11
@Abs nibName é o nome da ponta a ser carregada para instanciar a exibição.
Rashii
As animações de transição de orientação param de trabalhar com isso.
User3427013
Eu já votei isso lol ... "tenho que iniciar a janela e depois definir o quadro, tenho que iniciar a janela e depois definir o quadro, tenho que iniciar a janela e definir o quadro" -me comigo
Chris Allinson
18

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'.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = // Your RootViewController in here
        self.window = window
        window.makeKeyAndVisible()
    }

}
gamal
fonte
1
Muito apreciado.
Azim Talukdar
14

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.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    // mainStoryboard
    let mainStoryboard = UIStoryboard(name: "MainStoryboard", bundle: nil)

    // rootViewController
    let rootViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainViewController") as? UIViewController

    // navigationController
    let navigationController = UINavigationController(rootViewController: rootViewController!)

    navigationController.navigationBarHidden = true // or not, your choice.

    // self.window
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    self.window!.rootViewController = navigationController

    self.window!.makeKeyAndVisible()
}

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.

John Bushnell
fonte
11

eu tinha feito isso no objetivo-c espero que seja útil para você

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

UIViewController *viewController;

NSUserDefaults *loginUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *check=[loginUserDefaults objectForKey:@"Checklog"];

if ([check isEqualToString:@"login"]) {

    viewController = [storyboard instantiateViewControllerWithIdentifier:@"SWRevealViewController"];
} else {

    viewController = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
}


self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
Patel Jigar
fonte
Como você projetou os View Controllers no storyboard.
Poonam
controladores de vista de arrastar e ID storyboard conjunto de identidade: <ViewControllerName> e acessar seu controlador de vista ...
Patel Jigar
@PatelJigar como configurar o loginvc
Uma Madhavi
chamar o controlador de visualização como este UITabBarController * tbc = [self.storyboard instantiateViewControllerWithIdentifier: @ "ContentViewController"]; [self presentViewController: tbc animado: conclusão SIM: nula];
Patel Jigar
7

Código para Swift 4.2 e 5:

var window: UIWindow?


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

     let storyboard = UIStoryboard(name: "Main", bundle: nil)

     let initialViewController = storyboard.instantiateViewController(withIdentifier: "dashboardVC")

     self.window?.rootViewController = initialViewController
     self.window?.makeKeyAndVisible()
}

E para Xcode 11+ and for Swift 5+:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

     var window: UIWindow?

     func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
         if let windowScene = scene as? UIWindowScene {
             let window = UIWindow(windowScene: windowScene)

              window.rootViewController = // Your RootViewController in here

              self.window = window
              window.makeKeyAndVisible()
         }
    }
}
Jamil Hasnine Tamim
fonte
self.window fornece error O valor do tipo 'AppDelegate' não possui 'janela' de membro, tem alguma idéia?
Joseph Astrahan
@JosephAstrahan declara uma variável antes de chamá-la. Como - var window: UIWindow?.
Jamil Hasnine Tamim
@JosephAstrahan verifique minha resposta novamente. Eu adicionei variável.
Jamil Hasnine Tamim
Obrigado, isso ajuda muito!
Joseph Astrahan
And for Xcode 11+ and for Swift 5+parte me ajuda muito. obrigado cara
Torongo 01/03
6

Eu 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:

var window: UIWindow?

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

E se você estiver usando o controlador de navegação, use o seguinte código para isso:

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let navigationController:UINavigationController = storyboard.instantiateInitialViewController() as! UINavigationController
    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController")
    navigationController.viewControllers = [initialViewController]
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()      
    return true
}
Kunal
fonte
Oi ... Mayank, eu tinha feito no Xcode 8 e rápida 3.0 Que erro vem depois de utilizar esta solução, porque ele está trabalhando
Kunal
6

Swift 4:

Adicione essas linhas dentro de AppDelegate.swift, dentro da função didFinishLaunchingWithOptions () ...

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // Setting the Appropriate initialViewController

    // Set the window to the dimensions of the device
    self.window = UIWindow(frame: UIScreen.main.bounds)

    // Grab a reference to whichever storyboard you have the ViewController within
    let storyboard = UIStoryboard(name: "Name of Storyboard", bundle: nil)

    // Grab a reference to the ViewController you want to show 1st.
    let initialViewController = storyboard.instantiateViewController(withIdentifier: "Name of ViewController")

    // Set that ViewController as the rootViewController
    self.window?.rootViewController = initialViewController

    // Sets our window up in front
    self.window?.makeKeyAndVisible()

    return true
}

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 eif userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }

Wade Sellers
fonte
ele não funciona em um novo projeto com 1 ViewController adicionado. Sempre inicia no controlador de exibição inicial. Xcode 11.2 Onde pode haver um problema?
Oleh H
5

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 é:

  • No Main.storyboard, crie UINavigationController sem rootViewController, configure-o como ponto de entrada
  • Criar 2 (ou mais) "Mostrar" segues em controladores de vista, atribuir-lhes alguma id, dizem id1 e ID2
  • Use o próximo código:

    class AppDelegate: UIResponder, UIApplicationDelegate {
    
       var window: UIWindow?
    
       func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
           let navigationController = window!.rootViewController! as! UINavigationController
           navigationController.performSegueWithIdentifier(conditionVariable ? "id1" : "id2")
    
           return true
       }

Espero que isto ajude.

Borzh
fonte
1
o erro "sem ponto de entrada no storyboard" é devido a uma configuração do projeto que pode ser excluída. vá para projeto> informações> propriedades personalizadas de destino do iOS e exclua a propriedade "Nome principal da base do arquivo do storyboard". O aviso não deve mais aparecer.
orangemako
5

Se você não estiver usando o storyboard. Você pode inicializar seu controlador de exibição principal programaticamente.

Swift 4

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let rootViewController = MainViewController()
    let navigationController = UINavigationController(rootViewController: rootViewController)
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

    return true
}
class MainViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .green
    }
}

E também remova Maindas Informações de implantação .

insira a descrição da imagem aqui

p-sol
fonte
Isso funcionou comigo no Swift 4.2, XCode 11.3, IOS 9 ~ 13.3.1
Coder ACJHP
4

Aqui está a solução completa no Swift 4 implementa isso em didFinishLaunchingWithOptions

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

 let isLogin = UserDefaults.standard.bool(forKey: "Islogin")
    if isLogin{
        self.NextViewController(storybordid: "OtherViewController")


    }else{
        self.NextViewController(storybordid: "LoginViewController")

    }
}

escreva esta função em qualquer lugar dentro do Appdelegate.swift

  func NextViewController(storybordid:String)
{

    let storyBoard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let exampleVC = storyBoard.instantiateViewController(withIdentifier:storybordid )
   // self.present(exampleVC, animated: true)
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = exampleVC
    self.window?.makeKeyAndVisible()
}
M Murteza
fonte
3

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.

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let yourVC = mainStoryboard.instantiateViewControllerWithIdentifier("YOUR_VC_IDENTIFIER") as! YourViewController
appDelegate.window?.rootViewController = yourVC
appDelegate.window?.makeKeyAndVisible()
Ankit Goel
fonte
3

Para o veloz 4.0 .

No seu arquivo AppDelegate.swift no método didfinishedlaunchingWithOptions , coloque o seguinte código.

var window: UIWindow?


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

    let rootVC = MainViewController() // your custom viewController. You can instantiate using nib too. UIViewController(nib name, bundle)
    //let rootVC = UIViewController(nibName: "MainViewController", bundle: nil) //or MainViewController()
    let navController = UINavigationController(rootViewController: rootVC) // Integrate navigation controller programmatically if you want

    window?.rootViewController = navController

    return true
}

Espero que funcione bem.

Rubaiyat Jahan Mumu
fonte
3
Trabalhou ..se você ainda não definido viewController inicial em stroyboard então você tem que adicionar janela = UIWindow (quadro: UIScreen.main.bounds)
Punit
3

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

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).

        self.window = self.window ?? UIWindow()//@JA- If this scene's self.window is nil then set a new UIWindow object to it.

        //@Grab the storyboard and ensure that the tab bar controller is reinstantiated with the details below.
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let tabBarController = storyboard.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController

        for child in tabBarController.viewControllers ?? [] {
            if let top = child as? StateControllerProtocol {
                print("State Controller Passed To:")
                print(child.title!)
                top.setState(state: stateController)
            }
        }

        self.window!.rootViewController = tabBarController //Set the rootViewController to our modified version with the StateController instances
        self.window!.makeKeyAndVisible()

        print("Finished scene setting code")
        guard let _ = (scene as? UIWindowScene) else { return }
    }

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.

como definir o ID do 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

import Foundation

struct tdfvars{
    var rbe:Double = 1.4
    var t1half:Double = 1.5
    var alphaBetaLate:Double = 3.0
    var alphaBetaAcute:Double = 10.0
    var totalDose:Double = 6000.00
    var dosePerFraction:Double = 200.0
    var numOfFractions:Double = 30
    var totalTime:Double = 168
    var ldrDose:Double = 8500.0
}

//@JA - Protocol that view controllers should have that defines that it should have a function to setState
protocol StateControllerProtocol {
  func setState(state: StateController)
}

class StateController {
    var tdfvariables:tdfvars = tdfvars()
}

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.

    class SettingsViewController: UIViewController {
    var stateController: StateController?
.... }

Em seguida, nesses mesmos arquivos, adicione o seguinte:

extension SettingsViewController: StateControllerProtocol {
  func setState(state: StateController) {
    self.stateController = state
  }
}

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.

Joseph Astrahan
fonte
3

Desativar Main.storyboard

General -> Deployment Info -> Main Interface -> remove `Main` 
Info.plist -> remove Key/Value for `UISceneStoryboardFile` and  `UIMainStoryboardFile`

Adicionar ID do Storyboard

Main.storyboard -> Select View Controller -> Inspectors -> Identity inspector -> Storyboard ID -> e.g. customVCStoryboardId

Swift 5 e Xcode 11

Ampliar UIWindow

class CustomWindow : UIWindow {
    //...
}

Edição gerada pelo Xcode SceneDelegate.swift

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: CustomWindow!

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let windowScene = (scene as? UIWindowScene) else { return }

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let initialViewController = storyboard.instantiateViewController(withIdentifier: "customVCStoryboardId")

        window = CustomWindow(windowScene: windowScene)
        window.rootViewController = initialViewController
        window.makeKeyAndVisible()
    }

    //...
}
yoAlex5
fonte
Pode definir o controlador raiz para o controlador de exibição inicial window.rootViewController = UIStoryboard (name: "Main", bundle: nil) .instantiateInitialViewController ()
Kamran Khan em
1
I worked out a solution on Xcode 6.4 in swift. 

// I saved the credentials on a click event to phone memory

    @IBAction func gotobidderpage(sender: AnyObject) {
 if (usernamestring == "bidder" && passwordstring == "day303")
        {
            rolltype = "1"

NSUserDefaults.standardUserDefaults().setObject(usernamestring, forKey: "username")
NSUserDefaults.standardUserDefaults().setObject(passwordstring, forKey: "password")
NSUserDefaults.standardUserDefaults().setObject(rolltype, forKey: "roll")


            self.performSegueWithIdentifier("seguetobidderpage", sender: self)
}


// Retained saved credentials in app delegate.swift and performed navigation after condition check


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

let usernamestring = NSUserDefaults.standardUserDefaults().stringForKey("username")
let passwordstring = NSUserDefaults.standardUserDefaults().stringForKey("password")
let rolltypestring = NSUserDefaults.standardUserDefaults().stringForKey("roll")

        if (usernamestring == "bidder" && passwordstring == "day303" && rolltypestring == "1")
        {

            // Access the storyboard and fetch an instance of the view controller
            var storyboard = UIStoryboard(name: "Main", bundle: nil)
            var viewController: BidderPage = storyboard.instantiateViewControllerWithIdentifier("bidderpageID") as! BidderPage

            // Then push that view controller onto the navigation stack
            var rootViewController = self.window!.rootViewController as! UINavigationController
            rootViewController.pushViewController(viewController, animated: true)
        }

        // Override point for customization after application launch.
        return true
    }



Hope it helps !
AG
fonte
1
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
}
Mukul Sharma
fonte
1

Abra um viewcontroller com o delegado SWRevealViewController From App.

 self.window = UIWindow(frame: UIScreen.main.bounds)
 let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil)
 let swrevealviewcontroller:SWRevealViewController = storyboard.instantiateInitialViewController() as! SWRevealViewController 
 self.window?.rootViewController = swrevealviewcontroller
 self.window?.makeKeyAndVisible()
Abdul Qayyum
fonte
0

Para Swift 5+


var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            let submodules = (
                home: HomeRouter.createModule(),
                search: SearchRouter.createModule(),
                exoplanets: ExoplanetsRouter.createModule()
            )
            
            let tabBarController = TabBarModuleBuilder.build(usingSubmodules: submodules)
            
            window.rootViewController = tabBarController
            self.window = window
            window.makeKeyAndVisible()
        }
    }
Utsav Dave
fonte