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

252

Как мне программно установить InitialViewControllerраскадровку? Я хочу открыть свою раскадровку в другом представлении в зависимости от некоторых условий, которые могут варьироваться от запуска к запуску.

UserDev
источник
1
Проверяйте этот ответ без предупреждения, не снимая основной раскадровки в настройках.
Борж

Ответы:

466

Как без фиктивного начального вида контроллера

Убедитесь, что все начальные контроллеры представления имеют Storyboard ID.

В раскадровке снимите флажок «Исходный контроллер вида» из первого контроллера представления.

Если вы запустите свое приложение на этом этапе, вы увидите:

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

И вы заметите, что ваше свойство окна в делегате приложения теперь равно nil.

В настройках приложения перейдите к своей цели и Infoвкладке. Там ясно, стоимость Main storyboard file base name. На Generalвкладке очистите значение для Main Interface. Это удалит предупреждение.

Создайте окно и желаемый начальный контроллер представления в application:didFinishLaunchingWithOptions:методе делегата приложения :

- (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
источник
7
Люблю! Люблю! Люблю! Я буду использовать это для переключения между двумя совершенно разными деревьями контроллера представления для IOS6 и IOS7. Похоже, это лучший способ справиться с обратной совместимостью, при этом все еще используются все функции IOS7.
Hunkpapa
6
Я изучаю программирование на iOS в Swift. Может кто-нибудь помочь мне, как написать приведенный выше код в Swift. пожалуйста помоги. Спасибо.
Рагхавендра
1
@bdv didFinishLaunchingWithOptionsвызывается, когда приложение запускается в новом процессе. Если вы перейдете на домашний экран и вернетесь в приложение, этот метод больше не будет вызываться. (Если iOS не завершает работу из-за ограничений памяти.) Попробуйте остановить приложение и снова запустить его из среды IDE. Если проблема не исчезнет, ​​сообщите об этом в SO, и я с радостью помогу вам, друг.
Трэвис
2
@peyman Согласно моему исследованию, окно не существует после удаления ссылки на основную раскадровку. Я прокомментировал реализацию окна в моем текущем проекте и обнаружил, что это все еще так.
Трэвис
2
@Raghav, вот быстрый код: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

Для всех любителей Swift ответ @Travis переведен на SWIFT :

Сделайте то, что @Travis объяснил перед кодом Objective C. Затем,

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
}

Это ExampleViewControllerбудет новый начальный контроллер вида, который вы хотели бы показать.

Шаги объяснили:

  1. Создайте новое окно с размером текущего окна и установите его в качестве основного окна.
  2. Создание раскадровки, которую мы можем использовать для создания нашего нового начального контроллера представления
  3. Создание нашего нового начального контроллера представления на основе его идентификатора раскадровки
  4. Установите корневой контроллер нашего нового окна в качестве нового контроллера, который мы только что инициировали
  5. Сделайте наше новое окно видимым

Наслаждайтесь и счастливого программирования!

Отображаемое имя
источник
меня попросили @Travis за эту версию, а потом ... Спасибо, в любом случае.
Деллос
Идентификатор раскадровки находится в разделе «Идентичность» на панели «Инспектор идентификации»
Доминик,
2
Подсказка, чтобы не нуждаться в идентификаторе раскадровки, состоит в том, чтобы явно установить начальный контроллер представления (rootViewController) в раскадровке и использовать метод экземпляра UIStoryboard.instantiateInitialViewController (), чтобы получить контроллер вместо UIStoryboard.instantiateViewControllerWithIdentifier (), предложенного выше. В остальном то же самое.
Эрик Бумендил
45

Вы можете программно установить rootViewController ключевого окна в (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

например:

- (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
источник
Как затем инициировать исходную точку входа из вторичного UIViewController?
ooxio
@ooxio: вы можете сохранить исходную точку входа в глобальном месте, а затем использовать ее позже.
Chengjiong
это действительно полезно, если вы хотите создать экземпляр для входа в систему / регистрации или чего-то в этом роде
Honey
Это гораздо проще, чем ответ @ Travis выше, потому что вам не нужно возиться с миллионом настроек проекта и возиться с IB. Кому интересно, если один из ваших контроллеров представления является технически начальным VC по умолчанию, а затем вы программно переключаетесь на другой?
Дэнни
Обратите внимание, что замененный, назначенный раскадровкой начальный View Viewler будет по-прежнему создаваться и проходить через init()/ deinit()цикл, но без выполнения viewDidLoad()или правильной инициализации IBOutlet-s. Убедитесь, что ваш код готов к этому.
Гэри
14

Swift 3: обновление до кода @ 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
источник
Спасибо, @MEK. Также вы можете исправить синтаксис операторов условного закрытия, заменив завершающие скобки фигурными скобками.
Native_Mobile_Arch_Dev
9

Вы можете установить Navigation rootviewcontroller в качестве контроллера основного вида. Эту идею можно использовать для автоматического входа в систему согласно требованию приложения.

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];

Для пользователей 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];
}

Спасибо

Bhavsar1311
источник
6

Откройте mainstoryboard, сначала выберите представление, которое вы хотите запустить, затем откройте Utilities -> Attributes. Под «View Controller» вы видите радиокнопку «Is initial View Controller». Просто выберите это.

--- к пересмотренному вопросу:

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

m.etka
источник
Я написал метод в ViewDidLoad, но он не работал, и когда я запишу его в viewdidAppear, он работает, вы можете объяснить, почему это происходит.
UserDev
Возможно, вам следует попробовать это: добавить код segue в соответствии с вашими условиями в один из соответствующих методов в файле appDelegate.m. Например, вы можете добавить код segue в метод applicationDidBecomeActive:.
м.этка
@Jagdev вы пишете это в ViewDidAppear вместо ViewDidLoad.
Umair Khan Jadoon
Проблема с этим подходом заключается в том, что начальный контроллер представления становится видимым в течение некоторого времени, а затем переключается на другой, что не очень хорошо с точки зрения UX, поэтому не является хорошим решением.
Вишал Дхаранкар
3

SWIFT 5

Если у вас не установлен ViewController в качестве начального ViewController в раскадровке, вам нужно сделать 2 вещи:

  1. Перейдите к вашему проекту TARGETS, выберите ваш проект -> General -> Clear the Main Interface field.
  2. Всегда внутри проекта TARGETS, теперь перейдите в Информация -> Манифест сцены приложения -> Конфигурация сцены -> Роль сеанса приложения -> Item0 (Конфигурация по умолчанию) -> удалить поле имени раскадровки.

Наконец, теперь вы можете добавить свой код в 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
источник
Это, безусловно, самый последний ответ на Xcode 11.5, и он действительно исправил Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not setпредупреждение, которое я получал после того, как решил создать свой первоначальный VC в коде. Важным моментом, когда @ rs7 говорит «удалить поле имени раскадровки», они означают весь ряд списка, а не только содержимое самого поля.
cdf1982
2

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

Shmidt
источник
2

Вы можете установить initial view controller с помощью Interface Builder, а также программно.

Ниже описан подход, используемый для программного обеспечения.

Цель-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;

Свифт:

        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
Джайпракаш Дубей
источник
2

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

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

}

И в вашем AppDelegate вызовите это

 self.window = UIWindow(frame: UIScreen.main.bounds)
 Routing.decideInitialViewController(window: self.window!)
Варун Нагария
источник
2

Вот еще одно решение с использованием Swift 3 и Swift 4, позволяющее избежать наложения силы.

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
}

И ниже используется с 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
источник
2

В AppDelegate.swiftвы можете добавить следующий код:

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

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

Кроме того, не забудьте добавить удостоверение (выберите раскадровку -> Сцена контроллера -> Показать инспектор удостоверений -> назначить StorboardID).

Недим Талович
источник
1

ОБНОВЛЕННЫЙ ОТВЕТ для iOS 13 и делегата сцены:

Убедитесь, что в вашем файле info.plist вы попали в Манифест сцены приложения -> Конфигурация сцены -> Роль сеанса приложения -> Элемент 0 и также удалите ссылку на главную раскадровку. В противном случае вы получите то же предупреждение о невозможности создания экземпляра из раскадровки.

Кроме того, переместите код из делегата приложения в сцену метода делегата сцены (_: willConnectTo: options :), так как именно здесь обрабатываются события жизненного цикла.

bze12
источник
0

Несколько дней назад я столкнулся с такой же ситуацией. Очень простой трюк решил эту проблему. Я установил скрытый мой начальный вид контроллера до запуска2. Если начальный контроллер представления является правильным контроллером, это установлено в видимый в viewDidLoad. Иначе, переход выполняется к желаемому контроллеру представления. Он отлично работает в iOS 6.1 и выше. Я уверен, что это работает на более ранних версиях iOS.

m.etka
источник
0

Спасибо изменил это в 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()
    }
Джереми
источник
0

Нашел простое решение - не нужно удалять «первоначальную проверку контроллера вида» из раскадровки и редактировать вкладку «Информация о проекте» и использовать makeKeyAndVisible, просто поместите

self.window.rootViewController = rootVC;

в

- (BOOL) application:didFinishLaunchingWithOptions:
alex1704
источник
Но вы все еще получаете rootVCот instantiateViewControllerWithIdentifier, правильно?
Томерс
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

Другим способом является представление viewController,

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

Сначала вам нужно создать объект вашей раскадровки, затем изменить корень (если требуется), затем вы берете ссылку на конкретный контроллер представления, который выдвигает текущий контроллер представления (если вы меняете root), иначе это просто новый контроллер представления, который может

В.Д. Пурохит
источник
@VD Purohit, можете ли вы подробнее рассказать о своем ответе для большего понимания?
Prags
0

Swift 4, Xcode 9

в файле 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
}
Шань Йе
источник
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**
Чарльз
источник
проверка по nsuser Значение по умолчанию значение настройки значения Заполнение полностью и проверка условия при первом просмотре Проблема контроллера
charles
0

Swift 5 или выше # сделать контроллер вида маршрута с помощью этого простого кода. Если вы используете xcode 11 или выше, сначала инициализируйте var window: UIWindow?в 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()
Рохит Нишад
источник
0

Если вы предпочитаете не изменять applicationDidFinish, вы можете сделать следующий трюк:

Установите контроллер навигации в качестве начального контроллера представления и назначьте ему пользовательский класс «MyNavigationController». Затем вы можете настроить его корневой контроллер представления во время viewDidLoad - он переопределит корневой контроллер представления, который вы установили в раскадровке.

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

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

}
Камень Добрев
источник
-3

Выберите контроллер представления, который вы хотите открыть первым, и перейдите к инспектору атрибутов. Перейти к начальной сцене и проверить, является ли начальная опция просмотра контроллера.

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

ИМАШ
источник