2014-11-05 7 views
87

Я хотел бы установить начальный viewcontroller из appdelegate. Я нашел действительно хороший ответ, однако он находится в Objective C, и им трудно справляться с одним и тем же быстро.set initial viewcontroller в appdelegate - swift

Programmatically set the initial view controller using Storyboards

- (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 зависел от определенных условий, выполняемых с помощью условного оператора.

+0

Это возможный дубликат: http: // stackoverflow.com/questions/10428629/programatically-set-the-initial-view-controller-using-storyboards/14926009 # 14926009 – Honey

ответ

204

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

Instantiate and Present a viewController in 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 
} 
+1

не может найти раскадровку «Главная», или «Storyboard.storyboard» в swift 2 app –

+4

Является ли это текущим стандартным способом * установить начальный контроллер представления в appdelegate *? Я спрашиваю, потому что это выглядит как маленький бит взлома (извините @Abs). – rigdonmr

+6

@rigdonmr Если приложение имеет раскадровку, установленную в качестве основного интерфейса, окно загружается автоматически, а его контроллер корневого представления установлен в начальный контроллер представления раскадровки. Если диспетчеру просмотра необходимо изменить на основе какого-либо условия или приложение не имеет основного интерфейса, допустимо инициализировать 'UIWindow' и программным образом установить его корневой контроллер. – JAL

32

Попробуйте это. Например: Вы должны использовать 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 
} 

См my storyboard screen.

+1

Приложение показывает черный экран после запуска – Abs

+0

Вы установили идентификатор раскадровки для просмотра контроллера в раскадровке? См. Http://joxi.ru/l2ZYxZqS8JOomJ – protikhonoff

+0

Да, уже установлен, я думаю, что он успешно открывает viewcontrollers, но он не «показывает» его. Есть идеи? – Abs

18

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

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

Какое имя имен ниба? – Abs

+0

@Abs nibName - имя загружаемого nib для создания экземпляра представления. – rashii

+0

Анимации перехода к ориентации перестают работать с этим. – user3427013

11

я сделал это на Objective-C надеюсь, что это будет полезно для швеллеров

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

Как вы разработали View Controllers в раскадровке. Пожалуйста, помогите. – Poonam

+0

вид сопротивления контроллеры и раскадровка ID набора удостоверений: и получить доступ к контроллеру вид ... –

+0

@PatelJigar как установить в loginvc –

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 ! 
12

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

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» в качестве раскадровки ID на главном контроллере представления, и имя файла в раскадровку в этом случае будет «MainStoryboard.storyboard». Я переименовываю свои раскадровки таким образом, потому что Main.storyboard для меня не является правильным именем, особенно если вы когда-нибудь переходите на подкласс.

2

Только в случае, если вы хотите сделать это в контроллере представления, а не в приложении делегата: Просто получать ссылку на 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() 
4

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

Если вы хотите иметь 2 (или более) вид входа контроллеров, которые зависят от некоторых условий (скажем conditionVariable), то, что вы должны сделать, это:

  • В вашей Main.storyboard создать 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 
        } 
    

Надеется, что это помогает.

+0

Ошибка «нет точки входа в раскадровку» из-за конфигурации проекта, которую можно удалить. перейдите в проект> информация> пользовательские целевые свойства iOS и удалите свойство «Основное имя файла раскадровки». Предупреждение больше не должно появляться. – orangemako

6

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

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

не работает в Swift 3 –

+0

Привет ... Mayank, я сделал в Xcode 8 и swift 3.0. Какая ошибка возникает после использования этого решения, потому что она работает – Kunal

11

Для Xcode 8 Swift 3:

Instantiate корень диспетчер просмотра с раскадровки:

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 как корень:

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 контроллер представления корня из XIb:

Это почти то же самое, но вместо линий

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

вы» необходимо будет написать

let viewController = YourViewController(nibName: "YourViewController", bundle: nil) 
2

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 
} 

Сейчас, к примеру, много раз мы делаем что-то вроде этого, когда мы хотим либо переключить пользователя на экран входа в систему, либо на начальный экран настройки, либо вернуться к главному экрану приложения и т. д. Если вы хотите сделать что-то подобное, вы можете использовать эту точку в качестве fork-in-the-road для этого.

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

Смежные вопросы