установить начальный viewcontroller в appdelegate - swift

Я хотел бы установить начальный viewcontroller из appdelegate. Я нашел действительно хороший ответ, однако это в Задаче C, и у меня возникли проблемы с достижением того же самого в быстром темпе.

Программно установить начальный контроллер представления с помощью раскадровки

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

Кто-нибудь может помочь?

Я хочу, чтобы начальный Viewcontroller зависел от определенных условий, выполняемых с помощью условного оператора.

ios
109 голосов | спросил Abubakar Moallim 5 32014vEurope/Moscow11bEurope/MoscowWed, 05 Nov 2014 12:46:18 +0300 2014, 12:46:18

14 ответов


0

Я использовал эту ветку, чтобы помочь мне преобразовать цель C в стремительную, и она отлично работает.

Создание и представление viewController в Swift

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
}

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 5 32014vEurope/Moscow11bEurope/MoscowWed, 05 Nov 2014 15:29:28 +0300 2014, 15:29:28
0

Попробуй это. Например: Вы должны использовать UINavigationController в качестве контроллера начального вида. Затем вы можете установить любой контроллер представления как root от раскадровки.

 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
}

Смотрите мой экран раскадровки.

ответил protikhonoff 5 32014vEurope/Moscow11bEurope/MoscowWed, 05 Nov 2014 13:07:12 +0300 2014, 13:07:12
0

если вы не используете раскадровку, попробуйте это

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 5 32014vEurope/Moscow11bEurope/MoscowWed, 05 Nov 2014 13:34:39 +0300 2014, 13:34:39
0

Для Swift 3, Swift 4:

Создание корневого контроллера представления из раскадровки:

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
    }

Если вы хотите использовать UINavigationController от имени 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
    }

Создание корневого контроллера представления из xib:

Это почти то же самое, но вместо строк

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

вам придется написать

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)
ответил Eridana 23 32016vEurope/Moscow11bEurope/MoscowWed, 23 Nov 2016 16:08:27 +0300 2016, 16:08:27
0

Вот хороший способ приблизиться к этому. В этом примере размещается контроллер навигации в качестве корневого контроллера представления и помещается выбранный вами контроллер представления внизу стека навигации, готовый к тому, чтобы вытолкнуть из него все, что вам нужно.

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

Чтобы этот пример работал, вы должны установить «MainViewController» в качестве идентификатора раскадровки на контроллере основного представления, а имя файла раскадровки в этом случае будет «MainStoryboard.storyboard». Я переименовываю свои раскадровки таким образом, потому что Main.storyboard для меня не является подходящим именем, особенно если вы когда-нибудь перейдете на его подкласс.

ответил John Bushnell 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 02 Sep 2015 01:15:16 +0300 2015, 01:15:16
0

Я сделал это на объективной цели. С, надеюсь, это будет полезно для вас.

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 9 J0000006Europe/Moscow 2015, 10:28:13
0

Я сделал это в Xcode 8 и swift 3.0, надеюсь, он будет полезен для вас и работает отлично. Используйте следующий код:

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
}

И если вы используете контроллер навигации, используйте для этого следующий код:

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 29 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 29 Sep 2016 13:39:43 +0300 2016, 13:39:43
0

Swift 4:

Добавьте эти строки в AppDelegate.swift, внутри функции 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
}

Теперь, например, много раз мы делаем что-то подобное, когда хотим либо перевести пользователя на экран входа в систему, либо на экран начальной настройки, либо обратно на главный экран приложения и т. д. например, вы можете использовать эту точку в качестве развилки для этого.

Подумай об этом. Вы можете хранить значение в NSUserDefaults, например, в котором хранится логическое значение userLoggedIn и if userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }

ответил Wade Sellers 15 FebruaryEurope/MoscowbThu, 15 Feb 2018 13:22:46 +0300000000pmThu, 15 Feb 2018 13:22:46 +030018 2018, 13:22:46
0

Ну, все ответы выше /ниже приводят к предупреждению о том, что в раскадровке нет точки входа.

Если вы хотите иметь 2 (или более) контроллеров представления ввода, которые зависят от какого-либо условия (скажем, conditionVariable ), то вам нужно сделать следующее:

  • В вашей основной платформе создайте UINavigationController без rootViewController, установите его в качестве точки входа
  • Создайте 2 (или более) сегмента «Показать» в контроллерах представления, назначьте им некоторый идентификатор, скажем, id1 и id2
  • Используйте следующий код:

    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
       }
    

Надеюсь, это поможет.

ответил Borzh 22 MarpmTue, 22 Mar 2016 18:43:42 +03002016-03-22T18:43:42+03:0006 2016, 18:43:42
0

На всякий случай, если вы хотите сделать это в контроллере представления, а не в делегате приложения: просто извлеките ссылку на AppDelegate в вашем контроллере представления и сбросьте объект окна с помощью правильного контроллера представления так как это 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 19 MarpmSat, 19 Mar 2016 23:04:46 +03002016-03-19T23:04:46+03:0011 2016, 23:04:46
0
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 !
ответил A.G 19 AM000000100000000231 2015, 10:19:02
0

Вот полное решение в Swift 4 реализовать это в 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")

    }
}

напишите эту функцию в любом месте внутри 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 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 28 Sep 2018 09:15:48 +0300 2018, 09:15:48
0

Для swift 4.0 .

В своем файле AppDelegate.swift в методе didfinishedlaunchingWithOptions вставьте следующий код.

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
}

Надеюсь, что это будет хорошо работать.

ответил mumu 11 +03002018-10-11T08:37:52+03:00312018bEurope/MoscowThu, 11 Oct 2018 08:37:52 +0300 2018, 08:37:52
0
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 2 PM00000040000004431 2018, 16:20:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132