webentwicklung-frage-antwort-db.com.de

Programmgesteuertes Einstellen des anfänglichen Ansichts-Controllers mithilfe von Storyboards

Wie kann ich das InitialViewController für ein Storyboard programmgesteuert festlegen? Ich möchte mein Storyboard für eine andere Ansicht öffnen, abhängig von einigen Bedingungen, die von Start zu Start variieren können.

242
UserDev

Wie geht man ohne einen Dummy-Controller für die Erstansicht

Stellen Sie sicher, dass alle Erstansichts-Controller eine Storyboard-ID haben.

Deaktivieren Sie im Storyboard das Attribut "Ist der ursprüngliche Ansichts-Controller" im ersten Ansichts-Controller.

Wenn Sie Ihre App zu diesem Zeitpunkt ausführen, lesen Sie:

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

Und Sie werden feststellen, dass Ihre Fenstereigenschaft im App-Delegaten jetzt null ist.

Wechseln Sie in den App-Einstellungen zu Ihrem Ziel und zur Registerkarte Info. Dort löschen Sie den Wert von Main storyboard file base name. Löschen Sie auf der Registerkarte General den Wert für Main Interface. Dadurch wird die Warnung entfernt.

Erstellen Sie das Fenster und den gewünschten Erstansichts-Controller mit der Methode application:didFinishLaunchingWithOptions: Des App-Delegaten:

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

Für alle schnellen Liebhaber gibt es hier die Antwort von @ Travis übersetzt in Swift :

Mach was @ Travis erklärt vor dem Objective C Code. Dann,

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
}

Das ExampleViewController ist der neue Controller für die Erstansicht, den Sie anzeigen möchten.

Die Schritte erklärt:

  1. Erstellen Sie ein neues Fenster mit der Größe des aktuellen Fensters und legen Sie es als unser Hauptfenster fest
  2. Instanziieren Sie ein Storyboard, mit dem wir unseren neuen Controller für die Erstansicht erstellen können
  3. Instanziieren Sie unseren neuen Controller für die Erstansicht basierend auf seiner Storyboard-ID
  4. Legen Sie den Stammansichts-Controller unseres neuen Fensters als den neuen Controller fest, den wir gerade initiiert haben
  5. Machen Sie unser neues Fenster sichtbar

Viel Spaß beim Programmieren!

116
Display name

Sie können den rootViewController des Schlüsselfensters programmgesteuert in (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions Einstellen.

zum Beispiel:

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

Swift 3: Update auf @ Victor-Siglers Code

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

Sie können den Navigations-Rootview-Controller als Hauptansichts-Controller festlegen. Diese Idee kann für die automatische Anmeldung gemäß den Anwendungsanforderungen verwendet werden.

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 [email protected]{

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

Für StoryboardSegue-Benutzer

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

Vielen Dank

9
Bhavsar1311

Öffnen Sie das Mainstoryboard, wählen Sie die Ansicht aus, die Sie zuerst starten möchten, und öffnen Sie dann Dienstprogramme -> Attribute. Unterhalb des "View Controllers" sehen Sie das Optionsfeld "Ist der ursprüngliche View Controller". Einfach auswählen.

--- Zur überarbeiteten Frage:

Möglicherweise können Sie Folgendes versuchen: Schreiben Sie eine Methode in den ViewDidLoad-Abschnitt Ihrer ursprünglichen Ansicht. Wenn die Methode beim Start der Anwendung ausgeführt wird, löst die Methode einen Übergang zu einer anderen Ansicht aus.

6
m.etka

Im AppDelegate.Swift Sie können den folgenden Code hinzufügen:

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

Natürlich müssen Sie Ihre Logik implementieren, basierend auf welchen Kriterien Sie einen geeigneten Ansichtscontroller auswählen.

Vergessen Sie auch nicht, eine Identität hinzuzufügen (wählen Sie Storyboard -> Controller-Szene -> Identitätsinspektor anzeigen -> StorboardID zuweisen).

2
Nedim Talovic

Ich denke nicht, dass es möglich ist. Stattdessen können Sie einen anfänglichen Controller haben, der Übergänge zu verschiedenen Ansichtscontrollern hat. Beim Start können Sie entscheiden, welcher Abschnitt programmgesteuert ausgeführt werden soll.

2
Shmidt

Eine andere Lösung mit Swift und Swift 4 unter Vermeidung von Force Casting ist wie folgt

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
}

Und unten ist mit 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
abdullahselek

Sie können initial view controller mit Interface Builder sowie programmgesteuert.

Im Folgenden wird der programmgesteuerte Ansatz beschrieben.

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

Swift:

        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

Ich habe eine Routing-Klasse erstellt, um die dynamische Navigation zu handhaben und die AppDelegate-Klasse sauber zu halten. Ich hoffe, sie wird auch anderen helfen.

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

}

Und nennen Sie dies in Ihrem AppDelegate

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

Dank änderte dies wie folgt in 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
Jeremy

Gefundene einfache Lösung - es ist nicht erforderlich, "Initial View Controller Check" aus dem Storyboard zu entfernen und die Registerkarte "Projektinfo" zu bearbeiten und makeKeyAndVisible zu verwenden. Platzieren Sie sie einfach

self.window.rootViewController = rootVC;

im

- (BOOL) application:didFinishLaunchingWithOptions:
0
alex1704
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

Ein anderer Weg ist, viewController zu präsentieren,

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

Zuerst müssen Sie ein Objekt Ihres Storyboards erstellen, dann den Stamm ändern (falls erforderlich) und dann den Verweis auf einen bestimmten Ansichtscontroller verwenden, der als Push für den aktuellen Ansichtscontroller verwendet wird (falls Sie den Stamm ändern). Andernfalls wird möglicherweise nur ein neuer Ansichtscontroller angezeigt

0
V D Purohit
 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**
0
charles

Vor ein paar Tagen bin ich auf die gleiche Situation gestoßen. Ein sehr einfacher Trick löste dieses Problem. Ich habe meinen anfänglichen View-Controller vor dem Start ausgeblendet2. Wenn der anfängliche Ansichts-Controller der richtige Controller ist, wird er in viewDidLoad als sichtbar festgelegt. Andernfalls wird eine Übergabe an die gewünschte Ansichtssteuerung durchgeführt. Es funktioniert perfekt in iOS 6.1 und höher. Ich bin sicher, dass es auf früheren Versionen von iOS funktioniert.

0
m.etka

Swift 4, Xcode 9

in der Datei 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
Shan Ye