atur viewcontroller awal di appdelegate - swift

147

Saya ingin mengatur viewcontroller awal dari appdelegate. Saya menemukan jawaban yang sangat bagus, tetapi ada di Objective C dan saya kesulitan mencapai hal yang sama dengan cepat.

Secara terprogram mengatur pengontrol tampilan awal menggunakan Storyboard

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

Adakah yang bisa membantu?

Saya ingin Viewcontroller awal bergantung pada kondisi tertentu yang dipenuhi menggunakan pernyataan kondisional.

Abubakar Moallim
sumber
Ini kemungkinan duplikat dari: stackoverflow.com/questions/10428629/…
Honey

Jawaban:

279

Saya menggunakan utas ini untuk membantu saya mengonversi obyektif C menjadi cepat, dan berfungsi dengan sempurna.

Instantiate dan Presentasikan viewController di Swift

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

Kode Swift 3 :

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

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

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

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

    return true
}
Abubakar Moallim
sumber
1
tidak dapat menemukan storyboard "Main", atau "Storyboard.storyboard" di aplikasi swift 2
Async-
5
Apakah ini cara standar saat ini untuk mengatur pengontrol tampilan awal di appdelegate ? Saya bertanya karena sepertinya sedikit hack (maaf @Abs).
rigdonmr
10
@rigdonmr Jika aplikasi memiliki Storyboard ditetapkan sebagai Antarmuka Utama, jendela dimuat secara otomatis dan pengontrol tampilan root diatur ke pengontrol tampilan awal storyboard. Jika pengontrol tampilan perlu diubah berdasarkan suatu kondisi, atau aplikasi tidak memiliki Antarmuka Utama, dapat diterima untuk menginisialisasi UIWindowdan mengatur pengontrol tampilan root-nya secara terprogram.
JAL
2
Yang mengejutkan (tapi bagus) di sini adalah bahwa instantiating view controller secara manual dengan cara ini muncul untuk menghentikan iOS dari instantiating view controller default. Saya mungkin berharap keduanya dimuat. Apakah perilaku ini didokumentasikan di suatu tempat?
Pat Niemeyer
2
@ MayankJain ini berfungsi baik dengan Swift 3, hanya perlu menerjemahkan beberapa kode dari swift sebelumnya
JAB
42

Coba ini. Misalnya: Anda harus menggunakan UINavigationControllerpengontrol tampilan awal. Lalu, Anda bisa mengatur view controller sebagai root dari storyboard.

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

Lihat layar storyboard saya.

protikhonoff
sumber
Apakah Anda mengatur Storyboard ID untuk Anda melihat controller di storyboard? Lihat joxi.ru/l2ZYxZqS8JOomJ
protikhonoff
Yap sudah diatur, saya pikir itu berhasil membuka viewcontrollers, tetapi tidak 'menunjukkan' itu. Ada ide?
Abubakar Moallim
Tidak ada kesalahan, setelah peluncuran layar, saya mendapatkan halaman hitam
Abubakar Moallim
Saya kira saya menemukan masalahnya. Anda harus memeriksa "Is Initial View Controller" di storyboard Anda. joxi.ru/8AnNbQlhq3QOAO
protikhonoff
tapi saya ingin mengubah viewcontroller awal menggunakan pernyataan kondisional.
Abubakar Moallim
24

Untuk Swift 3, Swift 4:

Instantiate controller tampilan root dari storyboard:

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

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

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

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

Jika Anda ingin menggunakan UINavigationControllersebagai 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
    }

Instantiate controller tampilan root dari xib:

Ini hampir sama, tetapi bukannya garis

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

Anda harus menulis

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

jika Anda tidak menggunakan storyboard, Anda dapat mencoba ini

var window: UIWindow?
var initialViewController :UIViewController?

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

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

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

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

    return true
}
Jibin Jose
sumber
1
apa yang dimaksud dengan nama pena?
Abubakar Moallim
@Abs nibName adalah nama nib yang akan dimuat untuk instantiate tampilan.
rashii
Animasi transisi orientasi berhenti bekerja dengan ini.
user3427013
Saya sudah meningkatkan ini lol ... "harus init jendela lalu atur bingkai itu, harus init jendela kemudian atur bingkai itu, harus init jendela kemudian atur bingkai itu" -saya sendiri
Chris Allinson
18

Untuk Xcode 11.xxx dan Swift 5.xx baru, di mana targetnya diatur ke iOS 13+.

Untuk struktur proyek baru, AppDelegate tidak perlu melakukan apa pun mengenai rootViewController.

Kelas baru ada di sana untuk menangani kelas window (UIWindowScene) -> file 'SceneDelegate'.

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

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

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

}
gamal
sumber
1
Banyak yang dihargai.
Azim Talukdar
14

Ini cara yang bagus untuk mendekatinya. Contoh ini menempatkan pengontrol navigasi sebagai pengontrol tampilan root, dan menempatkan pengontrol tampilan pilihan Anda di dalamnya di bagian bawah tumpukan navigasi, siap untuk Anda mendorong apa pun yang Anda butuhkan darinya.

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

Untuk membuat contoh ini berfungsi, Anda akan mengatur "MainViewController" sebagai Storyboard ID pada pengontrol tampilan utama Anda, dan nama file storyboard dalam kasus ini adalah "MainStoryboard.storyboard". Saya mengubah nama storyboard saya dengan cara ini karena Main.storyboard bagi saya bukanlah nama yang tepat, terutama jika Anda pernah pergi untuk subklas itu.

John Bushnell
sumber
11

Saya telah melakukannya dengan objektif-c harap ini akan berguna bagi Anda

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

UIViewController *viewController;

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

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

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

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


self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
Patel Jigar
sumber
Bagaimana Anda merancang Lihat Pengontrol di storyboard. Tolong bantu.
Poonam
seret pengontrol tampilan dan set ID storyboard identitas: <ViewControllerName> dan akses pengontrol tampilan Anda ...
Patel Jigar
@PatelJigar cara mengatur loginvc
Uma Madhavi
panggil view controller seperti ini UITabBarController * tbc = [self.storyboard instantiateViewControllerWithIdentifier: @ "ContentViewController"]; [self presentViewController: tbc animated: YES completion: nil];
Patel Jigar
7

Kode untuk kode Swift 4.2 dan 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()
}

Dan untuk Xcode 11+ and for Swift 5+:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

     var window: UIWindow?

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

              window.rootViewController = // Your RootViewController in here

              self.window = window
              window.makeKeyAndVisible()
         }
    }
}
Jamil Hasnine Tamim
sumber
self.window memberikan error Nilai jenis 'AppDelegate' tidak memiliki anggota 'jendela', ada ide?
Joseph Astrahan
@JosephAstrahan mendeklarasikan variabel sebelum memanggilnya. Seperti - var window: UIWindow?.
Jamil Hasnine Tamim
@JosephAstrahan periksa lagi jawabanku. Saya menambahkan variabel.
Jamil Hasnine Tamim
Terima kasih, itu membantu satu ton!
Joseph Astrahan
And for Xcode 11+ and for Swift 5+bagian banyak membantu saya. Terima kasih
kawan
6

Saya sudah melakukannya di Xcode 8 dan cepat 3.0 berharap ini akan berguna bagi Anda, dan ini bekerja dengan sempurna. Gunakan kode berikut:

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
}

Dan Jika Anda menggunakan pengontrol navigasi, maka gunakan kode berikut untuk itu:

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let navigationController:UINavigationController = storyboard.instantiateInitialViewController() as! UINavigationController
    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController")
    navigationController.viewControllers = [initialViewController]
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()      
    return true
}
Kunal
sumber
Hai ... Mayank, saya lakukan di Xcode 8 dan swift 3.0 Kesalahan mana yang muncul setelah menggunakan solusi ini karena berfungsi
Kunal
6

Swift 4:

Tambahkan baris-baris ini di dalam AppDelegate.swift, di dalam fungsi 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
}

Sekarang, misalnya, sering kali kita melakukan sesuatu seperti ini ketika kita ingin mengarahkan pengguna ke layar masuk atau ke layar pengaturan awall atau kembali ke layar utama aplikasi, dll. Jika Anda ingin melakukan sesuatu seperti itu juga , Anda dapat menggunakan titik ini sebagai fork-in-the-road untuk itu.

Pikirkan tentang itu. Anda bisa memiliki nilai yang disimpan di NSUserDefaults misalnya yang dimiliki oleh userLoggedIn Boolean danif userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }

Penjual Wade
sumber
itu tidak berfungsi dalam proyek baru dengan 1 ViewController ditambahkan. Selalu dimulai dari pengontrol tampilan awal. Xcode 11.2 Di mana bisa menjadi masalah?
Oleh H
5

Yah semua jawaban di atas / di bawah ini menghasilkan peringatan tentang tidak ada titik masuk di storyboard.

Jika Anda ingin memiliki 2 (atau lebih) pengendali tampilan entri yang bergantung pada beberapa kondisi (katakanlah conditionVariable ) maka yang harus Anda lakukan adalah:

  • Di Main.storyboard Anda, buat UINavigationController tanpa rootViewController, atur sebagai titik masuk
  • Buat 2 (atau lebih) "Tampilkan" segues ke tampilan pengendali, menetapkan mereka beberapa id, mengatakan ID1 dan ID2
  • Gunakan kode selanjutnya:

    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
       }

Semoga ini membantu.

Borzh
sumber
1
kesalahan "no entry point in storyboard" disebabkan oleh konfigurasi proyek yang dapat dihapus. buka proyek> info> properti target iOS khusus dan hapus properti "Nama dasar file storyboard utama". Peringatan seharusnya tidak lagi muncul.
orangemako
5

Jika Anda tidak menggunakan storyboard. Anda dapat menginisialisasi pengontrol tampilan utama Anda secara terprogram.

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

Dan juga hapus Maindari Info Penerapan .

masukkan deskripsi gambar di sini

p-matahari
sumber
Ini bekerja dengan saya di Swift 4.2, XCode 11.3, iOS 9 ~ 13.3.1
Coder ACJHP
4

Inilah Solusi lengkap di Swift 4 untuk mengimplementasikannya di 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")

    }
}

tulis Fungsi ini di mana saja di dalam Appdelegate.swift

  func NextViewController(storybordid:String)
{

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

Untuk berjaga-jaga jika Anda ingin melakukannya di view controller dan bukan di delegate app: Cukup ambil referensi ke AppDelegate di view controller Anda dan setel ulang objek window itu dengan view controller kanan karena itu rootviewController.

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

Untuk swift 4.0 .

Dalam file AppDelegate.swift Anda di metode didfinishedlaunchingWithOptions , masukkan kode berikut.

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
}

Semoga ini akan bekerja dengan baik.

Rubaiyat Jahan Mumu
sumber
3
Berhasil .. Jika Anda belum mengatur viewController awal di stroyboard maka Anda harus menambahkan window = UIWindow (frame: UIScreen.main.bounds)
Punit
3

Swift 5 & Xcode 11

Jadi di xCode 11 solusi window tidak lagi valid di dalam appDelegate. Mereka memindahkan ini ke SceneDelgate. Anda dapat menemukannya di file SceneDelgate.swift.

Anda akan melihat sekarang ada var window: UIWindow?hadiah.

Dalam situasi saya, saya menggunakan TabBarController dari storyboard dan ingin mengaturnya sebagai rootViewController.

Ini kode saya:

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

Pastikan untuk menambahkan ini ke metode adegan yang benar seperti yang saya lakukan di sini. Perhatikan bahwa Anda perlu mengatur nama pengenal untuk tabBarController atau viewController yang Anda gunakan di storyboard.

cara mengatur ID storyboard

Dalam kasus saya, saya melakukan ini untuk mengatur stateController untuk melacak variabel yang dibagi di antara tampilan tab. Jika Anda ingin melakukan hal yang sama, tambahkan kode berikut ...

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

Catatan: Cukup gunakan variabel Anda sendiri atau apa pun yang Anda coba untuk melacaknya, saya hanya mendaftarkan milik saya sebagai contoh di tdfvariables struct.

Di setiap tampilan TabController tambahkan variabel anggota berikut.

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

Kemudian pada file-file yang sama tambahkan berikut ini:

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

Apa yang dilakukan adalah memungkinkan Anda untuk menghindari pendekatan tunggal untuk melewatkan variabel di antara tampilan. Hal ini memungkinkan dengan mudah untuk model injeksi ketergantungan yang jauh lebih baik daripada pendekatan tunggal.

Joseph Astrahan
sumber
3

Nonaktifkan Main.storyboard

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

Tambahkan ID Storyboard

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

Swift 5 dan Xcode 11

Memperpanjang UIWindow

class CustomWindow : UIWindow {
    //...
}

Edit yang dihasilkan oleh 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
sumber
Dapat mengatur pengendali root ke pengendali tampilan awal window.rootViewController = UIStoryboard (nama: "Main", bundel: nil) .instantiateInitialViewController ()
Kamran Khan
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
sumber
1
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var exampleViewController: ExampleViewController = mainStoryboard.instantiateViewControllerWithIdentifier("ExampleController") as! ExampleViewController

    self.window?.rootViewController = exampleViewController

    self.window?.makeKeyAndVisible()

    return true
}
Mukul Sharma
sumber
1

Buka viewcontroller dengan SWRevealViewController From App delegate.

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

Untuk Swift 5+


var window: UIWindow?

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