18 ответов:
как без фиктивный контроллер начального вида
убедитесь, что все контроллеры начального вида имеют идентификатор раскадровки.
в раскадровке снимите флажок" является начальным контроллером вида " с первого контроллера вида.
если вы запустите ваше приложение в этот момент Вы будете читать:
Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?и вы заметите, что ваше свойство окна в делегате приложения теперь равно нулю.
в настройках приложения, перейти к вашей цели и
Infotab. Там очистить значениеMain storyboard file base name. НаGeneraltab, снимите значение дляMain Interface. Это позволит удалить предупреждение.создайте окно и нужный контроллер начального вида в делегате приложения
application:didFinishLaunchingWithOptions:способ:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UIViewController *viewController = // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>]; self.window.rootViewController = viewController; [self.window makeKeyAndVisible]; return YES; }
для всех Свифт любители там, вот ответ от @Travis переведена на Свифт:
что делать @Travis пояснил до объективных C код. Тогда,
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 }The
ExampleViewControllerбудет новый начальный контроллер вида, который вы хотели бы показать.действия объяснил:
- создайте новое окно с размером текущего окна и установите его в качестве основного окно
- создайте раскадровку, которую мы можем использовать для создания нашего нового начального контроллера вида
- создайте экземпляр нашего нового контроллера начального вида на основе его идентификатора раскадровки
- установите контроллер корневого вида нашего нового окна в качестве нашего нового контроллера, который мы только что запустили
- сделать наше новое окно видимым
наслаждайтесь и счастливого программирования!
вы можете программно установить rootViewController ключевого окна в
(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptionsнапример:
- (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; }
Swift 3: обновление до кода @ victor-sigler
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { self.window = UIWindow(frame: UIScreen.main.bounds) // Assuming your storyboard is named "Main" let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) // Add code here (e.g. if/else) to determine which view controller class (chooseViewControllerA or chooseViewControllerB) and storyboard ID (chooseStoryboardA or chooseStoryboardB) to send the user to if(condition){ let initialViewController: chooseViewControllerA = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardA") as! chooseViewControllerA self.window?.rootViewController = initialViewController ) }else{ let initialViewController: chooseViewControllerB = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardB") as! chooseViewControllerB self.window?.rootViewController = initialViewController ) self.window?.makeKeyAndVisible( return true }
Вы можете установить навигационный rootviewcontroller в качестве контроллера основного вида. Эта идея может использоваться для автоматического входа в систему в соответствии с требованиями приложения.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil]; UIViewController viewController = (HomeController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"HomeController"]; UINavigationController navController = [[UINavigationController alloc] initWithRootViewController:viewController]; self.window.rootViewController = navController; if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) { // do stuff for iOS 7 and newer navController.navigationBar.barTintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0]; navController.navigationItem.leftBarButtonItem.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0]; navController.navigationBar.tintColor = [UIColor whiteColor]; navController.navigationItem.titleView.tintColor = [UIColor whiteColor]; NSDictionary *titleAttributes =@{ NSFontAttributeName :[UIFont fontWithName:@"Helvetica-Bold" size:14.0], NSForegroundColorAttributeName : [UIColor whiteColor] }; navController.navigationBar.titleTextAttributes = titleAttributes; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } else { // do stuff for older versions than iOS 7 navController.navigationBar.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0]; navController.navigationItem.titleView.tintColor = [UIColor whiteColor]; } [self.window makeKeyAndVisible];Для Раскадровки Пользователей
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]; }спасибо
откройте mainstoryboard, выберите представление, которое вы хотите запустить первым, а затем откройте утилиты--> атрибуты. Под " контроллером вида "вы видите переключатель" is initial View Controller". Просто выберите его.
- - - к пересмотренному вопросу:
может быть, вы можете попробовать это: напишите метод в разделе ViewDidLoad вашего начального представления, и когда метод запускается при запуске приложения, метод запускает переход к другому представлению.
Я не думаю, что это возможно. Вместо этого вы можете иметь один начальный контроллер, который будет иметь сегменты для разных контроллеров представления. При запуске вы можете решить, какой сегмент выполнять программно.
вы можете установить
initial view controllerС помощью построителя интерфейса, а также программными средствами.Ниже приведен подход, используемый для программного обеспечения.
Цель-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
Я создал класс маршрутизации для обработки динамической навигации и чистоте класса AppDelegate, я надеюсь, что это поможет и другим.
// // 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() } }и в вашем AppDelegate вызовите это
self.window = UIWindow(frame: UIScreen.main.bounds) Routing.decideInitialViewController(window: self.window!)
другое решение с помощью Swift 3 и Swift 4 с избеганием силового литья это так
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 }и ниже используется с
UINavigationControllerfunc 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 }
на
AppDelegate.swiftвы можете добавить следующий код:let sb = UIStoryboard(name: "Main", bundle: nil) let vc = sb.instantiateViewController(withIdentifier: "YourViewController_StorboardID") self.window?.rootViewController = vc self.window?.makeKeyAndVisible()конечно, вам нужно реализовать свою логику, исходя из каких критериев вы выберете соответствующий контроллер вида.
кроме того, не забудьте добавить идентификатор (выберите storyboard -> Controller Scene -> Show The identity inspector -> assign StorboardID).
несколько дней назад я столкнулся с такой же ситуацией. Очень простой трюк, решил эту проблему. Я установил скрытый мой начальный контроллер вида перед launch2. Если исходный контроллер представления является правильным контроллера это значение отображается в метод viewDidLoad. В противном случае выполняется переход к нужному контроллеру вида. Он отлично работает в iOS 6.1 и выше. Я уверен, что он работает на более ранних версиях iOS.
спасибо изменил это следующим образом в 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() }
найдено простое решение-нет необходимости удалять "начальная проверка контроллера вида" из раскадровки и редактирования вкладки информация о проекте и использовать
makeKeyAndVisible, просто местоself.window.rootViewController = rootVC;на
- (BOOL) application:didFinishLaunchingWithOptions:
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другой способ-представить viewController,
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) let vc = mainStoryboard.instantiateViewController(withIdentifier: "storyBoardid") as! ViewController self.present(vc,animated:true,completion:nil)сначала вам нужно создать объект вашей раскадровки, а затем изменить корень (если требуется), то вы берете ссылку на конкретный контроллер вида, который нажимается текущий контроллер вида(если вы измените корень), иначе это просто новый контроллер вида, который может вам
Swift 4, Xcode 9
в файле AppDelegate.Свифт
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 }
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**
выберите контроллер вида, который вы хотите открыть первым, и перейдите в Инспектор атрибутов. Перейдите к начальной сцене и проверьте, является ли опция начального контроллера вида.
теперь это будет ваш начальный контроллер вида, который откроется первым при запуске приложения.
Comments