Setze den anfänglichen Viewcontroller in Appdelegate - Swift

147

Ich möchte den anfänglichen Viewcontroller über das Appdelegate einstellen. Ich habe eine wirklich gute Antwort gefunden, aber es ist in Ziel C und ich habe Probleme, das Gleiche schnell zu erreichen.

Stellen Sie den Controller für die anfängliche Ansicht mithilfe von Storyboards programmgesteuert ein

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

Kann jemand helfen?

Ich möchte, dass der anfängliche Viewcontroller von bestimmten Bedingungen abhängig ist, die mithilfe einer bedingten Anweisung erfüllt werden.

Abubakar Moallim
quelle
Dies ist ein mögliches Duplikat von: stackoverflow.com/questions/10428629/…
Honey

Antworten:

279

Ich habe diesen Thread verwendet, um das Ziel C in schnell umzuwandeln, und es funktioniert perfekt.

Instanziieren und Präsentieren eines viewControllers in Swift

Swift 2 Code:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

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

    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("LoginSignupVC")

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

    return true
}

Swift 3 Code:

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
quelle
1
Ich
5
Ist dies die derzeitige Standardmethode zum Festlegen des anfänglichen Ansichtscontrollers in appdelegate ? Ich frage, weil es wie ein kleiner Hack aussieht (sorry @Abs).
Rigdonmr
10
@rigdonmr Wenn für die Anwendung ein Storyboard als Hauptschnittstelle festgelegt ist, wird das Fenster automatisch geladen und der Root-View-Controller auf den ursprünglichen View-Controller des Storyboards festgelegt. Wenn sich der Ansichtscontroller aufgrund einer Bedingung ändern muss oder die Anwendung keine Hauptschnittstelle hat, ist es akzeptabel, a zu initialisieren UIWindowund seinen Stammansichtscontroller programmgesteuert festzulegen.
JAL
2
Das Überraschende (aber Gute) dabei ist, dass das manuelle Instanziieren des Ansichts-Controllers auf diese Weise iOS daran zu hindern scheint, den Standard-Ansichts-Controller zu instanziieren. Ich hätte erwarten können, dass beide geladen werden. Ist dieses Verhalten irgendwo dokumentiert?
Pat Niemeyer
2
@ MayankJain dies funktioniert gut mit Swift 3, muss nur einen Teil des Codes von früher Swift übersetzen
JAB
42

Versuche dies. Zum Beispiel: Sie sollten UINavigationControllerals Controller für die Erstansicht verwenden. Anschließend können Sie einen beliebigen Ansichts-Controller als Root im Storyboard festlegen.

 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
}

Siehe meinen Storyboard-Bildschirm.

Protikhonoff
quelle
Haben Sie die Storyboard-ID für Ihren View Controller im Storyboard festgelegt? Siehe joxi.ru/l2ZYxZqS8JOomJ
protikhonoff
Ja, bereits festgelegt, ich denke, es öffnet die Viewcontroller erfolgreich, aber es wird nicht angezeigt. Irgendwelche Ideen?
Abubakar Moallim
Keine Fehler, nach dem Start des Bildschirms bekomme ich eine schwarze Seite
Abubakar Moallim
Ich glaube, ich habe das Problem gefunden. Sie sollten in Ihrem Storyboard "Ist Initial View Controller" aktivieren. joxi.ru/8AnNbQlhq3QOAO
Protikhonoff
Ich möchte jedoch den anfänglichen Viewcontroller mithilfe einer bedingten Anweisung ändern.
Abubakar Moallim
24

Für Swift 3, Swift 4:

Instanziieren Sie den Root View Controller über das 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
    }

Wenn Sie UINavigationControllerals root verwenden möchten :

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
    }

Instanziieren Sie den Root View Controller von xib aus:

Es ist fast das gleiche, aber anstelle von Linien

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

du musst schreiben

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

Wenn Sie kein Storyboard verwenden, können Sie dies versuchen

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
quelle
1
Worauf bezieht sich der Name der Feder?
Abubakar Moallim
@Abs nibName ist der Name der Feder, die geladen werden soll, um die Ansicht zu instanziieren.
Rashii
Animationen für den Orientierungsübergang funktionieren damit nicht mehr.
user3427013
Ich habe dieses lol bereits hochgestuft ... "Ich muss das Fenster initiieren und dann den Rahmen einstellen, ich muss das Fenster initiieren, dann den Rahmen einstellen, ich muss das Fenster initiieren und dann den Rahmen einstellen"
Chris Allinson
18

Für den neuen Xcode 11.xxx und Swift 5.xx, wo das Ziel auf iOS 13+ festgelegt wurde.

Für die neue Projektstruktur muss AppDelegate nichts in Bezug auf rootViewController tun.

Eine neue Klasse dient zur Behandlung der Fensterklasse (UIWindowScene) -> 'SceneDelegate'-Datei.

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
quelle
1
Sehr geschätzt.
Azim Talukdar
14

Hier ist ein guter Weg, um es anzugehen. In diesem Beispiel wird ein Navigationscontroller als Root-View-Controller platziert und der View-Controller Ihrer Wahl am unteren Rand des Navigationsstapels platziert, damit Sie alles, was Sie benötigen, von ihm entfernen können.

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

Damit dieses Beispiel funktioniert, legen Sie "MainViewController" als Storyboard-ID auf Ihrem Hauptansichts-Controller fest. In diesem Fall lautet der Dateiname des Storyboards "MainStoryboard.storyboard". Ich benenne meine Storyboards auf diese Weise um, weil Main.storyboard für mich kein richtiger Name ist, insbesondere wenn Sie jemals in eine Unterklasse gehen.

John Bushnell
quelle
11

Ich hatte es auf Ziel-C getan, hoffe, es wird nützlich für dich sein

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
quelle
Wie haben Sie View Controller im Storyboard entworfen? Bitte helfen Sie.
Poonam
Ziehen Sie View Controller und legen Sie die Storyboard-ID der Identität fest: <ViewControllerName> und greifen Sie auf Ihren View Controller zu ...
Patel Jigar
@ PatelJigar wie man sich einloggt
Uma Madhavi
Aufruf des View Controllers wie folgt UITabBarController * tbc = [self.storyboard instantiateViewControllerWithIdentifier: @ "ContentViewController"]; [self presentViewController: tbc animiert: YES Vervollständigung: nil];
Patel Jigar
7

Code für Swift 4.2 und 5 Code:

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

Und für 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
quelle
self.window gibt Fehler aus Wert vom Typ 'AppDelegate' hat kein Mitglied 'Fenster', irgendwelche Ideen?
Joseph Astrahan
@JosephAstrahan deklariert eine Variable, bevor sie aufgerufen wird. Wie - var window: UIWindow?.
Jamil Hasnine Tamim
@ JosephAstrahan überprüfe meine Antwort noch einmal. Ich habe Variable hinzugefügt.
Jamil Hasnine Tamim
Danke, das hilft einer Menge!
Joseph Astrahan
And for Xcode 11+ and for Swift 5+Teil hilft mir sehr. danke Mann
Torongo
6

Ich hatte in Xcode 8 und Swift 3.0 getan, hoffe, es wird nützlich für Sie sein, und es funktioniert perfekt. Verwenden Sie folgenden Code:

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
}

Und wenn Sie den Navigationscontroller verwenden, verwenden Sie dafür den folgenden Code:

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
quelle
Hallo ... Mayank, ich hatte in Xcode 8 und Swift 3.0 getan. Welcher Fehler tritt nach der Verwendung dieser Lösung auf, weil sie funktioniert
Kunal
6

Swift 4:

Fügen Sie diese Zeilen in AppDelegate.swift und in der Funktion didFinishLaunchingWithOptions () hinzu ...

    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
}

Jetzt machen wir zum Beispiel oft so etwas, wenn wir den Benutzer entweder zu einem Anmeldebildschirm oder zu einem anfänglichen Einrichtungsbildschirm oder zurück zum Hauptbildschirm der App usw. führen möchten. Wenn Sie auch so etwas tun möchten können Sie diesen Punkt als Weggabelung dafür verwenden.

Denk darüber nach. Sie könnten beispielsweise einen Wert in NSUserDefaults speichern lassen, der einen userLoggedIn Boolean und enthältif userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }

Wade Sellers
quelle
In einem neuen Projekt mit 1 hinzugefügtem ViewController funktioniert dies nicht. Startet immer von der anfänglichen Ansichtssteuerung. Xcode 11.2 Wo kann ein Problem liegen?
Oleh H
5

Nun, alle Antworten oben / unten erzeugen eine Warnung vor keinem Einstiegspunkt im Storyboard.

Wenn Sie zwei (oder mehr) Controller für die Eingabeansicht haben möchten, die von einer bestimmten Bedingung abhängen (z. B. conditionVariable ), sollten Sie Folgendes tun:

  • Erstellen Sie in Ihrem Main.storyboard den UINavigationController ohne rootViewController und legen Sie ihn als Einstiegspunkt fest
  • Erstellen Sie 2 (oder mehr) "Show" -Segues in View-Controllern, weisen Sie ihnen eine ID zu, z. B. ID1 und ID2
  • Verwenden Sie den nächsten Code:

    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
       }

Hoffe das hilft.

Borzh
quelle
1
Der Fehler "Kein Einstiegspunkt im Storyboard" ist auf eine Projektkonfiguration zurückzuführen, die gelöscht werden kann. Gehen Sie zu Projekt> Info> Benutzerdefinierte iOS-Zieleigenschaften und löschen Sie die Eigenschaft "Name der Basis-Storyboard-Hauptdatei". Die Warnung sollte nicht mehr angezeigt werden.
Orangemako
5

Wenn Sie das Storyboard nicht verwenden. Sie können Ihren Hauptansichts-Controller programmgesteuert initialisieren.

Swift 4

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let rootViewController = MainViewController()
    let navigationController = UINavigationController(rootViewController: rootViewController)
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

    return true
}
class MainViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .green
    }
}

Und auch Mainaus den Bereitstellungsinformationen entfernen .

Geben Sie hier die Bildbeschreibung ein

p-Sonne
quelle
Dies funktionierte mit mir in Swift 4.2, XCode 11.3, IOS 9 ~ 13.3.1
Coder ACJHP
4

Hier ist die vollständige Lösung in Swift 4, die in didFinishLaunchingWithOptions implementiert wird

 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")

    }
}

Schreiben Sie diese Funktion an eine beliebige Stelle in 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
quelle
3

Nur für den Fall, dass Sie dies im Ansichts-Controller und nicht im App-Delegaten tun möchten: Rufen Sie einfach den Verweis auf das AppDelegate in Ihrem Ansichts-Controller ab und setzen Sie das Fensterobjekt mit dem richtigen Ansichts-Controller als rootviewController zurück.

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
quelle
3

Für schnelles 4.0 .

Geben Sie in Ihre AppDelegate.swift- Datei in der Methode didfinishedlaunchingWithOptions den folgenden Code ein.

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
}

Hoffe es wird gut funktionieren.

Rubaiyat Jahan Mumu
quelle
3
Arbeitete ..Wenn Sie nicht initial viewController in stroyboard gesetzt haben, müssen Sie window = UIWindow (Frame: UIScreen.main.bounds)
Punit
3

Swift 5 & Xcode 11

In xCode 11 ist die Fensterlösung in appDelegate nicht mehr gültig. Sie haben dies in das SceneDelgate verschoben. Sie finden dies in der Datei SceneDelgate.swift.

Sie werden feststellen, dass es jetzt ein var window: UIWindow?Geschenk hat.

In meiner Situation verwendete ich einen TabBarController aus einem Storyboard und wollte ihn als rootViewController festlegen.

Das ist mein Code:

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

Stellen Sie sicher, dass Sie dies der richtigen Szenenmethode hinzufügen, wie ich es hier getan habe. Beachten Sie, dass Sie den Bezeichnernamen für den tabBarController oder viewController festlegen müssen, den Sie im Storyboard verwenden.

So legen Sie die Storyboard-ID fest

In meinem Fall habe ich dies getan, um einen stateController festzulegen, der gemeinsam genutzte Variablen in den Registerkartenansichten verfolgt. Wenn Sie dasselbe tun möchten, fügen Sie den folgenden Code hinzu ...

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

Hinweis: Verwenden Sie stattdessen einfach Ihre eigenen Variablen oder was auch immer Sie verfolgen möchten. Ich habe meine nur als Beispiel in der Struktur tdfvariables aufgeführt.

Fügen Sie in jeder Ansicht des TabControllers die folgende Mitgliedsvariable hinzu.

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

Fügen Sie dann in denselben Dateien Folgendes hinzu:

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

Auf diese Weise können Sie den Singleton-Ansatz zum Übergeben von Variablen zwischen den Ansichten vermeiden . Dies ermöglicht leicht das Abhängigkeitsinjektionsmodell, das auf lange Sicht viel besser ist als der Singleton-Ansatz.

Joseph Astrahan
quelle
2

Deaktivieren Main.storyboard

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

Storyboard-ID hinzufügen

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

Swift 5 und Xcode 11

Erweitern UIWindow

class CustomWindow : UIWindow {
    //...
}

Von Xcode generierte Bearbeitung 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
quelle
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
quelle
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
quelle
1

Öffnen Sie einen Viewcontroller mit dem SWRevealViewController From App-Delegaten.

 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
quelle
0

Für 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
quelle