Програмно встановити початковий контролер перегляду за допомогою Сценарей


252

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


1
Перевірте цю відповідь без попередження, не очищаючи Основну дошку розкад у налаштуваннях.
Борж

Відповіді:


466

Як без манекена початкового контролера подання

Переконайтесь, що всі початкові контролери перегляду мають ідентифікатор архівної таблиці.

На аркуші роздачі зніміть прапорці "Чи є початковий контролер перегляду" від першого контролера перегляду.

Якщо ви запустите додаток у цей момент, ви прочитаєте:

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

І ви помітите, що ваша власність вікна в делегаті програми тепер нульова.

У налаштуваннях програми перейдіть до своєї цілі та 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;
}

7
Любов! Любов! Любов! Я використовую це для перемикання між двома абсолютно різними деревами контролера перегляду для IOS6 та IOS7. Здається, найкращий спосіб вирішити зворотну сумісність, використовуючи при цьому всі дзвіночки в IOS7.
Хункпапа

6
Я вивчаю програмування iOS у Swift. Чи може хто-небудь допомогти мені, як швидко написати вищевказаний код. будь ласка, допоможіть. Дякую.
Raghavendra

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

Для всіх любителів Свіфта , ось відповідь @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. Миттєво ввімкніть наш новий початковий контролер подання на основі його ідентифікатора Storyboard
  4. Встановіть наш новий контролер кореневого виду вікна як наш новий контролер, який ми тільки що ініціювали
  5. Зробіть видимим наше нове вікно

Насолоджуйтесь та радісно програмуйте!


я попросив @Travis про цю версію, а потім .... все одно, дякую.
dellos

Ідентифікатор розгортання знаходиться в розділі «Ідентичність» на панелі інспектора посвідчення особи
Домінік

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

Як потім ініціювати початкову точку входу з вторинного UIViewController?
ooxio

@ooxio: ви можете зберігати оригінальну точку входу в глобальному місці, а потім використовувати її згодом.
Chengjiong

це дуже корисно, якщо ви хочете створити реєстрацію або щось подібне ...
Honey,

Це набагато простіше, ніж відповідь @ Тревіса вище, тому що вам не доведеться возитися з мільйонними налаштуваннями проектів і майструвати в ІБ. Кому байдуже, чи технічно один з ваших контролерів перегляду за замовчуванням початковий VC, а потім ви програмно переймете на інший?
Денні

Зауважте, що замінений, призначений початковим контролером початковий контролер перегляду все одно отримає екземпляр та пройде init()/ deinit()цикл, але без виконання viewDidLoad()або належної ініціалізації IBOutlet. Переконайтеся, що код готовий до цього.
Гері

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 Крім того, ви можете виправити синтаксис умовних заяв про закриття, замінивши дужки в дужках дужками.
Native_Mobile_Arch_Dev

9

Ви можете встановити навігацію 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];
}

Дякую


6

Відкрийте основну дошку, виберіть перегляд, який ви хочете розпочати спочатку, а потім відкрийте Утиліти -> Атрибути. Під "Контролером перегляду" ви бачите перемикач "Чи є початковий контролер подання". Просто виберіть його.

--- До переглянутого питання:

Можливо, ви можете спробувати це: введіть метод у розділ ViewDidLoad свого первинного перегляду, і коли метод запускається при запуску програми, метод запускає мозок на інший вигляд.


Я написав метод у ViewDidLoad, але він не працював, і коли я перетворив його у viewdidAppear, він працює, ви можете пояснити, чому це відбувається.
UserDev

Можливо, вам слід спробувати це: Додайте кодовий код відповідно до своїх умов до одного з відповідних методів у файлі appDelegate.m. Наприклад, ви можете додати segue код до методу "applicationDidBecomeActive:".
м.етка

@Jagdev ви пишете це у ViewDidAppear замість ViewDidLoad.
Умаїр Хан Джадун

Проблема при такому підході полягає в тому, що початковий контролер подання виглядає на деякий час видно, а потім переходить на інший, що не добре з точки зору UX, тому не є хорошим рішенням.
vishal dharankar

3

SWIFT 5

Якщо у вас немає встановленого ViewController як початкового ViewController на дошці розкадрувань, вам потрібно зробити 2 речі:

  1. Перейдіть до ЦІЛІВ свого проекту, виберіть проект -> Загальне -> Очистити поле Основний інтерфейс.
  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()

}

Це, безумовно, найбільш актуальна відповідь щодо Xcode 11.5, і справді виправлено Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not setпопередження, яке я мав після того, як я вирішив інстанціювати свій початковий ВК в коді. Важливий момент, коли @ rs7 каже "видалити поле імені розкадрівки", вони мають на увазі весь ряд списку, а не лише зміст самого поля.
cdf1982

2

Я не думаю, що це можливо. Натомість у вас може бути один початковий контролер, який матиме з’єднання з різними контролерами перегляду. Під час запуску ви можете вирішити, який сейг виконувати програмно.


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
}

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 :), оскільки саме тут зараз обробляються події життєвого циклу.


0

Кілька днів тому я стикався з такою ж ситуацією. Дуже проста хитрість вирішила цю проблему. Я встановив прихований свій початковий контролер перегляду перед запуском2. Якщо початковий контролер перегляду є правильним контролером, його встановлено на видимість у viewDidLoad. В іншому випадку, відомість виконується для потрібного контролера перегляду. Він ідеально працює в iOS 6.1 і вище. Я впевнений, що він працює на більш ранніх версіях iOS.


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:

Але ви все одно отримаєте rootVCвід instantiateViewControllerWithIdentifier, правильно?
thomers

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)

Спочатку вам потрібно створити об’єкт вашої раскадровки, потім змінити корінь (якщо потрібно), потім ви посилаєтесь на конкретний контролер перегляду, який висувається поточним контролером перегляду (якщо ви змінюєте корінь).


@VD Purohit, чи можете ви більше описати свою відповідь для більшого розуміння.
Праги

0

Швидкий 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 Значення налаштувань значення за замовчуванням Повністю зберігається та перевіряється умова в режимі «intial view» Проблема контролера
charles

0

Швидкий 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

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

Тепер це буде ваш початковий контролер перегляду, який відкриється першим при запуску програми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.