установить начальный viewcontroller в appdelegate - swift

147

Я хотел бы установить начальный viewcontroller из appdelegate. Я нашел действительно хороший ответ, однако он находится в Цели C, и у меня возникают проблемы с быстрым достижением того же самого.

Программно установить начальный вид контроллера с помощью раскадровки

- (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;
}

Кто-нибудь может помочь?

Я хочу, чтобы начальный Viewcontroller зависел от определенных условий с помощью условного оператора.

Абубакар Моаллим
источник
Это возможный дубликат: stackoverflow.com/questions/10428629/…
Honey

Ответы:

279

Я использовал эту ветку, чтобы помочь мне преобразовать цель С в стремительную, и она отлично работает.

Создание и представление viewController в Swift

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
}

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
}
Абубакар Моаллим
источник
1
не удается найти раскадровку «Main» или «Storyboard.storyboard» в приложении swift 2
Async-
5
Это текущий стандартный способ установки контроллера начального вида в appdelegate ? Я спрашиваю, потому что это выглядит как немного взломать (извините @Abs).
rigdonmr
10
@rigdonmr Если приложение имеет раскадровку, установленную в качестве основного интерфейса, окно загружается автоматически, а его корневой контроллер представления устанавливается на первоначальный контроллер представления раскадровки. Если необходимо изменить контроллер представления в зависимости от условия или если приложение не имеет основного интерфейса, допустимо инициализировать UIWindowи программно установить его корневой контроллер представления.
JAL
2
Удивительная (но хорошая) вещь в том, что создание экземпляра контроллера представления вручную таким образом, кажется, мешает iOS создавать экземпляр контроллера представления по умолчанию. Я мог бы ожидать, что оба будут загружены. Это поведение где-то задокументировано?
Пэт Нимейер
2
@MayankJain это прекрасно работает со Swift 3, просто нужно перевести часть кода из более раннего swift
JAB
42

Попробуй это. Например: вы должны использовать в UINavigationControllerкачестве начального контроллера просмотра. Затем вы можете установить любой контроллер представления как root от раскадровки.

 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
}

Смотрите мой экран раскадровки.

protikhonoff
источник
Вы установили Storyboard ID для просмотра контроллера в раскадровке? Смотрите joxi.ru/l2ZYxZqS8JOomJ
protikhonoff
Да, уже установлено, я думаю, что он успешно открывает контроллеры представления, но это не «показывает» это. Любые идеи?
Абубакар Моаллим
Без ошибок, после запуска экрана я получаю чёрную страницу
Abubakar Moallim
Я думаю, я нашел проблему. Вы должны проверить «Is Initial View Controller» в вашей раскадровке. joxi.ru/8AnNbQlhq3QOAO
протихонов,
но я хочу изменить начальный viewcontroller с помощью условного оператора.
Абубакар Моаллим
24

Для Swift 3, Swift 4:

Создание корневого контроллера представления из раскадровки:

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
    }

Если вы хотите использовать UINavigationControllerот имени 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
    }

Создание корневого контроллера представления из xib:

Это почти то же самое, но вместо строк

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

тебе придется написать

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)
Эридана
источник
22

если вы не используете раскадровку, вы можете попробовать это

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
}
Джибин Хосе
источник
1
к чему относится название пера?
Абубакар Моаллим
@Abs nibName - это имя nib, которое будет загружено для создания экземпляра представления.
Рашии
Анимации перехода ориентации перестают работать с этим.
user3427013
Я уже проголосовал за это LOL ... "должен инициализировать окно, затем установить его фрейм, должен инициализировать окно, затем установить его фрейм, должен инициализировать окно, а затем установить его фрейм" - я себе
Крис Аллинсон
18

Для новых Xcode 11.xxx и Swift 5.xx, где целью является iOS 13+.

Для новой структуры проекта AppDelegate не должен ничего делать с rootViewController.

Новый класс для обработки класса окна (UIWindowScene) -> файл '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()
    }

}
Гамаль
источник
1
Многое ценится.
Азим Талукдар
14

Вот хороший способ приблизиться к этому. Этот пример помещает контроллер навигации в качестве корневого контроллера представления и помещает выбранный контроллер представления в него внизу стека навигации, готовый к тому, чтобы вы выталкивали из него все, что вам нужно.

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()
}

Чтобы этот пример работал, вы должны установить «MainViewController» в качестве идентификатора раскадровки на контроллере основного представления, а имя файла раскадровки в этом случае будет «MainStoryboard.storyboard». Я переименовываю свои раскадровки таким образом, потому что Main.storyboard для меня не является подходящим именем, особенно если вы когда-нибудь перейдете на его подкласс.

Джон Бушнелл
источник
11

я сделал это на объективной цели - с надеюсь, что это будет полезно для вас

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];
Патель Джигар
источник
Как вы разработали View Controllers в раскадровке. Пожалуйста, помогите.
Poonam
перетащите контроллеры представления и установите идентификатор раскадровки удостоверения личности: <ViewControllerName> и получите доступ к контроллеру представления ...
Patel Jigar
@PatelJigar, как установить в loginvc
Ума Мадхави
вызовите контроллер представления как этот UITabBarController * tbc = [self.storyboard instantiateViewControllerWithIdentifier: @ "ContentViewController"]; [self presentViewController: tbc animated: YES завершение: nil];
Патель Джигар
7

Код для Swift 4.2 и 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()
}

И для 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()
         }
    }
}
Джамиль Хаснин Тамим
источник
self.window выдает ошибку. Значение типа 'AppDelegate' не имеет члена 'window', есть идеи?
Джозеф Астрахань
@JosephAstrahan объявляет переменную перед ее вызовом. Как - var window: UIWindow?.
Джамиль Хаснин Тамим
@JosephAstrahan проверьте мой ответ еще раз. Я добавил переменную.
Джамиль Хаснин Тамим
Спасибо, это очень помогает!
Джозеф Астрахань
And for Xcode 11+ and for Swift 5+часть мне очень помогает. спасибо человек
Торонго
6

Я сделал в Xcode 8 и Swift 3.0 надеюсь, что он будет полезен для вас, и он работает отлично. Используйте следующий код:

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
}

И если вы используете контроллер навигации, то используйте для этого следующий код:

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
}
Кунал
источник
Привет ... Mayank, я сделал в Xcode 8 и swift 3.0. Какая ошибка возникает после использования этого решения, потому что оно работает
Kunal
6

Свифт 4:

Добавьте эти строки в AppDelegate.swift, внутри функции 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
}

Теперь, например, много раз мы делаем что-то подобное, когда хотим либо перевести пользователя на экран входа в систему, либо на экран начальной настройки, либо обратно на главный экран приложения и т. Д. Если вы тоже хотите сделать что-то подобное , вы можете использовать эту точку в качестве развилки для этого.

Подумай об этом. Вы можете иметь значение, хранящееся в NSUserDefaults, например, которое содержит логическое значение userLoggedIn иif userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }

Уэйд Селлерс
источник
это не работает в новом проекте с 1 добавленным ViewController. Всегда начинается с начального вида контроллера. Xcode 11.2 Где может быть проблема?
Олег Х
5

Все ответы выше / ниже дают предупреждение о том, что в раскадровке нет точек входа.

Если вы хотите иметь 2 (или более) контроллеров представления ввода, которые зависят от некоторого условия (скажем, conditionVariable ), то вам следует сделать следующее:

  • В вашей Main.storyboard создайте UINavigationController без rootViewController, установите его в качестве точки входа
  • Создайте 2 (или более) сегмента «Show» в контроллерах представления, назначьте им некоторый идентификатор, скажем, id1 и id2
  • Используйте следующий код:

    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
       }

Надеюсь это поможет.

Borzh
источник
1
ошибка «нет точки входа в раскадровку» связана с конфигурацией проекта, которую можно удалить. перейдите в проект> информация> пользовательские свойства цели iOS и удалите свойство "Основное имя файла раскадровки". Предупреждение больше не должно появляться.
Orangemako
5

Если вы не используете раскадровку. Вы можете инициализировать ваш основной контроллер вида программно.

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
    }
}

А также удалить Mainиз информации о развертывании .

введите описание изображения здесь

р-вс
источник
Это работало со мной в Swift 4.2, XCode 11.3, IOS 9 ~ 13.3.1
кодер ACJHP
4

Вот полное решение в Swift 4, реализующее это в 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")

    }
}

написать эту функцию в любом месте внутри 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()
}
М Муртеза
источник
3

На всякий случай, если вы хотите сделать это в контроллере представления, а не в делегате приложения: просто извлеките ссылку на AppDelegate в вашем контроллере представления и сбросьте его объект окна с правым контроллером представления в качестве его 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()
Анкит Гоэль
источник
3

Для быстрой 4.0 .

В вашем AppDelegate.swift файл в didfinishedlaunchingWithOptions методом, поместите следующий код.

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
}

Надеюсь, это будет хорошо работать.

Рубайят Джахан Муму
источник
3
Сработало .. Если вы не установили начальный viewController в stroyboard, то вам нужно добавить window = UIWindow (frame: UIScreen.main.bounds)
Punit
3

Swift 5 & Xcode 11

Таким образом, в xCode 11 оконное решение больше не действует внутри appDelegate. Они перенесли это в SceneDelgate. Вы можете найти это в файле SceneDelgate.swift.

Вы заметите, что теперь у него есть var window: UIWindow?подарок.

В моей ситуации я использовал TabBarController из раскадровки и хотел установить его как rootViewController.

Это мой код:

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 }
    }

Обязательно добавьте это в правильный метод сцены, как я сделал здесь. Обратите внимание, что вам нужно будет задать имя идентификатора для tabBarController или viewController, который вы используете в раскадровке.

как установить ID раскадровки

В моем случае я делал это, чтобы установить stateController для отслеживания общих переменных в представлениях вкладок. Если вы хотите сделать то же самое, добавьте следующий код ...

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()
}

Примечание: просто используйте ваши собственные переменные или то, что вы пытаетесь отслеживать, вместо этого я просто перечислил мои в качестве примера в структуре tdfvariables.

В каждом представлении TabController добавьте следующую переменную-член.

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

Затем в тех же файлах добавьте следующее:

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

Это позволяет избежать единого подхода к передаче переменных между представлениями. Это позволяет легко использовать модель внедрения зависимостей, которая намного лучше в долгосрочной перспективе, чем одноэлементный подход.

Иосиф Астрахань
источник
3

Отключить Main.storyboard

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

Добавить раскадровку

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

Swift 5 и Xcode 11

простираться UIWindow

class CustomWindow : UIWindow {
    //...
}

Редактировать сгенерированный 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
источник
Можно установить корневой контроллер в начальный вид контроллера window.rootViewController = UIStoryboard (имя: «Основной», комплект: ноль) .instantiateInitialViewController ()
Камран Хан
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
источник
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
}
Мукул Шарма
источник
1

Откройте viewcontroller с помощью SWRevealViewController из делегата приложения.

 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()
Абдул Кайюм
источник
0

Для 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()
        }
    }
Утсав Дэйв
источник