Secara terprogram mengatur pengontrol tampilan awal menggunakan Storyboard

252

Bagaimana cara saya mengatur InitialViewControlleruntuk Storyboard? Saya ingin membuka storyboard saya ke tampilan yang berbeda tergantung pada beberapa kondisi yang mungkin berbeda dari peluncuran ke peluncuran.

UserDev
sumber
1
Periksa jawaban ini tanpa peringatan, tanpa menghapus storyboard utama dalam pengaturan.
Borzh

Jawaban:

466

Cara tanpa kontroler tampilan awal dummy

Pastikan semua pengendali tampilan awal memiliki ID Storyboard.

Di storyboard, hapus centang atribut "Apakah pengendali tampilan awal" dari pengendali tampilan pertama.

Jika Anda menjalankan aplikasi pada titik ini, Anda akan membaca:

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

Dan Anda akan melihat bahwa properti jendela Anda di delegasi aplikasi sekarang nihil.

Dalam pengaturan aplikasi, buka target dan Infotab Anda. Jelas ada nilai Main storyboard file base name. Pada Generaltab, kosongkan nilainya untukMain Interface . Ini akan menghapus peringatan.

Buat jendela dan pengontrol tampilan awal yang diinginkan dalam metode delegasi aplikasi 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
sumber
7
Cinta! Cinta! Cinta! Saya akan menggunakan ini untuk beralih di antara dua pohon pengontrol tampilan yang sama sekali berbeda untuk IOS6 dan IOS7. Sepertinya cara terbaik untuk menangani kompatibilitas mundur, sementara masih menggunakan semua lonceng dan peluit di IOS7.
Hunkpapa
6
Saya belajar pemrograman iOS di Swift. Adakah yang bisa membantu saya bagaimana menulis kode di atas dengan cepat. tolong bantu. Terima kasih.
Raghavendra
1
@bdv didFinishLaunchingWithOptionsdipanggil saat aplikasi dimulai dalam proses baru. Jika Anda membuka layar beranda dan kembali ke aplikasi, metode ini tidak akan dipanggil lagi. (Kecuali iOS berakhir karena keterbatasan memori.) Coba hentikan aplikasi dan luncurkan sekali lagi dari IDE Anda. Jika masalah berlanjut, kirim masalah ke SO dan saya akan dengan senang hati membantu, teman.
Travis
2
@peyman Menurut investigasi saya, jendela tidak ada setelah referensi ke storyboard utama dihapus. Saya berkomentar keluar instantiation jendela dalam proyek saya saat ini dan menemukan ini masih menjadi kasus.
Travis
2
@Raghav, ini kode cepatnya: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

Untuk semua pecinta Swift di luar sana, inilah jawabannya oleh @Travis yang diterjemahkan ke dalam SWIFT :

Lakukan apa yang @Travis jelaskan sebelum kode Objective C. Kemudian,

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
}

Itu ExampleViewControllerakan menjadi pengontrol tampilan awal baru yang ingin Anda tampilkan.

Langkah-langkahnya menjelaskan:

  1. Buat jendela baru dengan ukuran jendela saat ini dan atur sebagai jendela utama kami
  2. Instantiate storyboard yang bisa kita gunakan untuk membuat controller tampilan awal baru kita
  3. Instantiate controller tampilan awal baru kami berdasarkan ID Storyboard itu
  4. Atur pengontrol tampilan root jendela baru kami sebagai pengontrol baru yang baru saja kami mulai
  5. Jadikan jendela baru kita terlihat

Selamat menikmati dan pemrograman!

Nama tampilan
sumber
saya diminta @Travis untuk versi ini, dan kemudian .... terima kasih.
dellos
Storyboard ID berada di bawah bagian Identity di panel inspektur Identity
Dominic
2
Tip untuk tidak memerlukan ID storyboard adalah dengan menetapkan secara eksplisit pengontrol tampilan awal (rootViewController) di storyboard, dan menggunakan metode instance UIStoryboard.instantiateInitialViewController () untuk mendapatkan pengontrol alih-alih UIStoryboard.instantiateViewControllerWithIdentifier () yang diusulkan di atas. Sisanya sama.
Eric Boumendil
45

Anda dapat secara program mengatur rootViewController jendela kunci (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

sebagai contoh:

- (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
sumber
Bagaimana cara memulai titik masuk asli dari UIViewController sekunder?
ooxio
@ooxio: Anda dapat menyimpan titik masuk asli di tempat global lalu menggunakannya nanti.
Chengjiong
ini sangat berguna jika Anda ingin instantiate untuk login / mendaftar atau sesuatu seperti itu ...
Honey
Ini jauh lebih mudah daripada jawaban @ Travis di atas karena Anda tidak perlu mengacaukan sejuta pengaturan proyek dan bermain-main di IB. Siapa yang peduli jika salah satu pengontrol tampilan Anda secara teknis VC awal default dan kemudian Anda secara terprogram mengalihkan ke yang lain?
Danny
Perhatikan bahwa View Controller awal yang diganti, yang ditunjuk storyboard masih akan dipakai dan melalui siklus init()/ deinit(), tetapi tanpa mengeksekusi viewDidLoad()atau menginisialisasi IBOutlet-s dengan benar . Pastikan kode Anda siap untuk itu.
Gary
14

Swift 3: Perbarui ke kode @ 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
sumber
Terima kasih, @MEK. Juga, Anda mungkin ingin mengoreksi sintaks pernyataan penutup bersyarat dengan mengganti tanda kurung tertinggal dengan kawat gigi.
Native_Mobile_Arch_Dev
9

Anda dapat mengatur Navigasi rootviewcontroller sebagai pengendali tampilan utama. Gagasan ini dapat digunakan untuk masuk otomatis sesuai kebutuhan aplikasi.

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

Untuk Pengguna 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];
}

Terima kasih

Bhavsar1311
sumber
6

Buka mainstoryboard, pilih tampilan yang ingin Anda mulai terlebih dahulu, lalu buka Utilities -> Attributes. Di bawah "View Controller" Anda melihat tombol radio "Is initial View Controller". Pilih saja.

--- Untuk pertanyaan yang direvisi:

Mungkin Anda dapat mencoba ini: menulis metode di bagian ViewDidLoad tampilan awal Anda dan ketika metode berjalan pada saat peluncuran aplikasi, metode memicu segue ke tampilan lain.

m.etka
sumber
Saya menulis metode di ViewDidLoad tetapi tidak berhasil dan ketika saya melihatnya di viewdidAppear berfungsi, dapatkah Anda menjelaskan mengapa ini terjadi.
UserDev
Mungkin Anda harus mencoba ini: Tambahkan kode segue sesuai dengan kondisi Anda ke salah satu metode yang sesuai dalam file appDelegate.m. Misalnya, Anda dapat menambahkan kode segue ke metode "applicationDidBecomeActive:".
m.etka
@ Jagdev Anda menulisnya di ViewDidAppear, bukan ViewDidLoad.
Umair Khan Jadoon
masalah dengan pendekatan ini adalah pengontrol tampilan awal muncul menjadi terlihat untuk beberapa waktu dan kemudian beralih ke yang lain yang tidak baik dari sudut pandang UX jadi bukan solusi yang baik.
vishal dharankar
3

SWIFT 5

Jika Anda tidak memiliki set ViewController sebagai ViewController awal di storyboard, Anda perlu melakukan 2 hal:

  1. Buka TARGET proyek Anda, pilih proyek Anda -> Umum -> Kosongkan bidang Antarmuka Utama.
  2. Selalu di dalam TARGETS proyek, sekarang buka Info -> Aplikasi Scene Manifest -> Scene Configuration -> Peran Sesi Aplikasi -> Item0 (Konfigurasi Default) -> hapus bidang nama storyboard.

Akhirnya, Anda sekarang dapat menambahkan kode Anda di 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
sumber
Ini tentu saja jawaban terbaru pada Xcode 11.5, dan memang memperbaiki Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not setperingatan yang saya miliki setelah saya memutuskan untuk instantiate VC awal saya dalam kode. Poin penting, ketika @ rs7 mengatakan "hapus bidang nama storyboard", artinya seluruh baris plist, bukan hanya konten bidang itu sendiri.
cdf1982
2

Saya pikir itu tidak mungkin. Sebagai gantinya, Anda dapat memiliki satu pengontrol awal yang akan memiliki segue untuk pengontrol tampilan yang berbeda. Saat memulai, Anda dapat memutuskan segmen mana yang akan tampil secara programatis.

Shmidt
sumber
2

Anda dapat mengatur initial view controllermenggunakan Interface Builder dan juga secara terprogram.

Di bawah ini adalah pendekatan yang digunakan untuk pemrograman.

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

Cepat:

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

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

        self.window?.rootViewController = objMainViewController

        self.window?.makeKeyAndVisible()

        return true
Jayprakash Dubey
sumber
2

Saya membuat kelas perutean untuk menangani navigasi dinamis dan menjaga kelas AppDelegate tetap bersih, saya harap ini akan membantu lainnya juga.

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

}

Dan di AppDelegate Anda panggil ini

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

Solusi lain dengan menggunakan Swift 3 dan Swift 4 dengan menghindari casting gaya adalah seperti ini

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
}

Dan di bawah ini digunakan dengan 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
sumber
2

Dalam AppDelegate.swiftAnda dapat menambahkan kode berikut:

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

Tentu saja, Anda perlu mengimplementasikan logika Anda, berdasarkan pada kriteria mana Anda akan memilih pengontrol tampilan yang sesuai.

Juga, jangan lupa untuk menambahkan identitas (pilih storyboard -> Scene Controller -> Tampilkan inspektur identitas -> assign StorboardID).

Nedim Talovic
sumber
1

JAWABAN TERBARU untuk iOS 13 dan delegasi adegan:

pastikan dalam file info.plist Anda, Anda masuk ke Application Scene Manifest -> Scene Configuration -> Aplikasi Session Role -> Item 0 dan hapus referensi ke storyboard utama di sana juga. Kalau tidak, Anda akan mendapatkan peringatan yang sama tentang kegagalan instantiate dari storyboard.

Juga, pindahkan kode dari delegasi aplikasi ke adegan metode delegasi adegan (_: willConnectTo: options :), karena di sinilah peristiwa siklus hidup ditangani sekarang.

bze12
sumber
0

Beberapa hari yang lalu saya mengalami situasi yang sama. Trik yang sangat sederhana menyelesaikan masalah ini. Saya mengatur tersembunyi pengontrol tampilan awal saya sebelum launch2. Jika pengontrol tampilan awal adalah pengontrol yang tepat, pengaturannya akan terlihat di viewDidLoad. Lain, segue dilakukan untuk pengontrol tampilan yang diinginkan. Ini berfungsi sempurna di iOS 6.1 dan di atasnya. Saya yakin ini berfungsi pada versi iOS sebelumnya.

m.etka
sumber
0

Terima kasih memodifikasi ini sebagai berikut di AppDelegate:

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

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

        self.window?.rootViewController = exampleViewController

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

        self.window?.rootViewController = exampleViewController

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

Ditemukan solusi sederhana - tidak perlu menghapus "pemeriksaan pengontrol tampilan awal" dari storyboard dan mengedit info proyek tab dan gunakan makeKeyAndVisible, cukup tempatkan

self.window.rootViewController = rootVC;

di

- (BOOL) application:didFinishLaunchingWithOptions:
alex1704
sumber
Tapi Anda masih dapat rootVCdari instantiateViewControllerWithIdentifier, benar?
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

Cara lain adalah menyajikan viewController,

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

Pertama, Anda perlu membuat objek storyboard Anda kemudian mengubah root (jika diperlukan) maka Anda mengambil referensi pengontrol tampilan tertentu yang mendorong pengontrol tampilan saat ini (jika Anda mengubah root) lain itu hanya hadir pengontrol tampilan baru yang mungkin Anda

VD Purohit
sumber
@VD Purohit, bisakah Anda menjelaskan lebih lanjut tentang jawaban Anda untuk lebih memahami.
Prags
0

Swift 4, Xcode 9

dalam file AppDelegate.swift

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

/*
use your view Controller identifier must use it doubles quotes**strong text**
charles
sumber
memeriksa nsuser Nilai default nilai preferensi nilai Disimpan sepenuhnya dan Memeriksa Kondisi dalam tampilan awal Masalah Pengontrol
charles
0

Swift 5 atau di atas # buat pengendali tampilan rute dengan kode sederhana ini. Jika Anda menggunakan xcode 11 atau lebih, inisialisasi pertama var window: UIWindow?di AppDelegate

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

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

Jika Anda memilih untuk tidak mengubah applicationDidFinish, Anda dapat melakukan trik berikut:

Atur pengontrol Navigasi sebagai pengontrol tampilan awal dan tetapkan untuk itu kelas khusus 'MyNavigationController'. Kemudian Anda dapat mengubah pengontrol tampilan root selama viewDidLoad - itu akan menimpa pengontrol tampilan root yang Anda atur di storyboard Anda.

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

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

}
Kamen Dobrev
sumber
-3

Pilih pengontrol tampilan yang ingin Anda buka pertama dan pergi ke inspektur atribut. Pergi ke adegan awal dan periksa adalah opsi pengontrol tampilan awal.

Sekarang ini akan menjadi pengontrol tampilan awal Anda yang akan terbuka pertama saat aplikasi diluncurkan.

iMash
sumber