Перейти от LaunchScreen к viewController в Main.Storyboard?

У меня есть некоторая логика, которую я хочу сделать на своем LaunchScreen, и если проверка в порядке, я хочу перейти к viewController, а если нет, я хочу перейти к другому, возможно ли это?


person Recusiwe    schedule 30.08.2016    source источник
comment
LaunchScreen вы имеете в виду для LaunchSotryboard? Или это просто еще один viewController в иерархии?   -  person Dravidian    schedule 30.08.2016
comment
Это LaunchScreen.storyboard. Я хочу перейти к конкретному в Main.Storyboard.   -  person Recusiwe    schedule 30.08.2016


Ответы (5)


У меня есть логика, которую я хочу реализовать на своем LaunchScreen.

Теперь, когда я понял вопрос, я могу ответить на него: не надо. Сделайте свою трудоемкую логику позже. Ваша задача — запустить быстро. Вам нужно выйти из applicationDidFinishLaunchingWithOptions, выйти из viewDidLoad и запустить.

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

person matt    schedule 13.09.2016
comment
@SAHM Разве это не то, о чем мы только что говорили в stackoverflow.com/questions/51884528/? Вы не запускаете. Среда выполнения запускает вас, и ваша задача — уйти с ее пути и позволить ей это сделать. Вы не знаете, когда выйдете из viewDidLoad. Вы просто реализуете сообщения о событиях, чтобы они делали то, что уместно в данный момент, не больше и не меньше. - person matt; 17.08.2018

Нет, вы не можете кодировать launchScreen.Storyboard. Причина: когда ваш launchScreen.storyboard показывает, что приложение все еще загружается.

Проще говоря: Вы не можете получить доступ к своему приложению, когда оно отображает launchScreen.storyboard, все, что вы можете сделать, это создать для него UI/UX, не выполняя для него никакого кода.

Альтернатива: - Сделайте viewController, который появляется как первый viewController, проверьте свою логику и сделайте что-то оттуда соответствующим образом!

Ссылка: - https://stackoverflow.com/a/27642160/6297658

person Dravidian    schedule 30.08.2016

Ваш LaunchScreen отображается во время загрузки вашего приложения. Перейдите к своему AppDelgate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

    window.rootViewController = //your root view controller that you have figured out with logic

    return true
}
person Pranav Wadhwa    schedule 30.08.2016

Запустите проверку в didFinishLaunchingWithOptions() и используйте ее, чтобы «перейти» непосредственно к определенному vc. Вот пример использования userDefaults, но, конечно, вы можете заменить его любой проверкой, которую вы выполняете.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // Do some logic

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let welcomeVC = storyboard.instantiateViewControllerWithIdentifier("WelcomeNavController")
            self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
            self.window?.rootViewController = welcomeVC
            self.window?.makeKeyAndVisible()
        }
}
person Shades    schedule 30.08.2016
comment
Есть ли способ, которым я могу продолжать показывать экран запуска, выполняя некоторую логику? Я не хочу, чтобы экран запуска исчезал до завершения логики. - person Recusiwe; 13.09.2016
comment
@Recusiwe, это хороший вопрос, и я действительно не знаю ответа. Я предполагаю, что это зависит от того, где находится логика, appDelegate или в контроллере представления, но это всего лишь предположение - person Shades; 13.09.2016
comment
Да, я хочу сделать некоторую логику в appDelegate и в зависимости от результата логики я хочу показать конкретный контроллер представления. - person Recusiwe; 13.09.2016
comment
@Recusiwe да, вы внедрили мой ответ в свой код. Это будет сделано - person Shades; 13.09.2016
comment
@Recusiwe см. обновленный ответ. Не забудьте принять f это помогает ;) - person Shades; 13.09.2016
comment
Есть ли способ, которым я могу продолжать показывать экран запуска, выполняя некоторую логику? Я не хочу, чтобы экран запуска исчезал до завершения логики. Нет. Если вы слишком долго будете запускать, WatchDog убьет вас заживо. Наоборот, вы должны запустить как можно быстрее. - person matt; 13.09.2016
comment
@matt, что отображается, когда экран запуска исчезает? Начало начального контроллера представления? - person Shades; 13.09.2016
comment
Да. Вы должны немедленно запустить кое-что. Если у вас есть трудоемкая логика (например, работа в сети), делайте это в фоновом режиме. Если вы хотите показать пользователю контроллер представления, который выглядит как ваш экран запуска, чтобы все оставалось замороженным, эй, я не могу вас остановить. :) Но дело в том, что вы должны выйти из didFinishLaunching и выйти из viewDidLoad и запустить очень быстро. Что вы будете делать после, это ваше дело. - person matt; 13.09.2016
comment
@matt Приятно знать. На самом деле я переместил код, устанавливающий мой источник данных, из моего первоначального vc в appDelegate, потому что мне не нравилось, что незавершенная таблица отображается, пока данные были готовы, но я переосмыслю это. - person Shades; 13.09.2016
comment
@matt Я не имел в виду настройку данных, я имел в виду показ экрана приветствия - person Shades; 13.09.2016
comment
Мне не понравилось, что незавершенная таблица показывалась, пока данные были готовы, но я передумаю, что именно это я и советую вам сделать. В промежутке вы можете показать что-то еще, но это не может быть LaunchScreen.storyboard, пока ваше приложение запускает свои колеса. Вы должны запускать быстро. Надеюсь, это поможет. (PS На эту тему есть видео WWDC.) - person matt; 13.09.2016
comment
Я также предоставил это как ответ. Ваш вопрос разумен, и потомство должно знать, что вы должны делать в этой ситуации. :) - person matt; 13.09.2016

Добавьте эту функцию в AppDelegate:

func initialVC(storyboardID: String) {

    let mainStoryboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let initialViewController : UIViewController = mainStoryboard.instantiateViewControllerWithIdentifier("\(storyboardID)") as UIViewController
    self.window?.makeKeyAndVisible()

    if storyboardID == "tabBarVC" {

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window?.rootViewController = initialViewController

    } else {

        let navController = UINavigationController(rootViewController: initialViewController)
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window?.rootViewController = navController

    } 
}

В методе didFinishLaunchingWithOptions внутри AppDelegate вы можете добавить это:

if currentUser != nil {

    initialVC("tabBarVC")

} else {

    initialVC("loginVC")

}

В моем примере вы можете видеть, что я либо загружаю VC основного приложения, либо VC входа в зависимости от того, вошел ли пользователь в систему. В вашем случае вы можете использовать оператор if-else и выполнять логику внутри функции initialVC.

Примечание. Когда я вызываю загрузку loginVC, мне нужно загрузить navigationController, потому что loginVC встроен в navigationController. Для tabBarVC я не вставляю navController, потому что он не нужен.

person Dan Levy    schedule 13.09.2016