【问题标题】:Segue from LaunchScreen to a viewController in Main.Storyboard?从 LaunchScreen 转到 Main.Storyboard 中的 viewController?
【发布时间】:2017-01-06 23:15:22
【问题描述】:

我想在我的 LaunchScreen 中执行一些逻辑,如果检查正常,我想继续到 viewController,如果不行,我想继续到另一个,这可能吗?

【问题讨论】:

  • LaunchScreen 你的意思是 LaunchSotryboard?或者它只是层次结构中的另一个 viewController?
  • 这是 LaunchScreen.storyboard。我想继续到 Main.Storyboard 中的特定内容。

标签: ios swift viewcontroller launch-screen


【解决方案1】:

将此函数添加到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

    } 
}

AppDelegate 内的didFinishLaunchingWithOptions 方法中,您可以添加:

if currentUser != nil {

    initialVC("tabBarVC")

} else {

    initialVC("loginVC")

}

您可以在我的示例中看到,我正在加载主应用程序 VC 或登录 VC,具体取决于用户是否登录。在您的情况下,您可以使用 if - else 语句并在 @ 中执行逻辑987654326@函数。

注意:当我调用加载 loginVC 时,我必须加载 navigationController,因为 loginVC 嵌入在导航控制器中。对于tabBarVC,我没有嵌入navController,因为它不需要。

【讨论】:

    【解决方案2】:

    我想在 LaunchScreen 中执行一些逻辑

    现在我理解了这个问题,我可以回答它:不要。稍后再做你耗时的逻辑。您的工作是快速启动。你需要离开applicationDidFinishLaunchingWithOptions,离开viewDidLoad,然后启动

    此时显示的内容取决于您;如果您有耗时的东西(在您的情况下,听起来您正在联网或在为表加载数据源时做其他需要时间的事情)并且您想显示一个涵盖时间的特殊视图控制器带有旋转的活动视图或其他东西,很好。但在实际发布期间不是这样做的时候。

    【讨论】:

    • @SAHM 这不是我们刚刚在stackoverflow.com/questions/51884528/… 谈论的吗? 没有启动。运行时正在启动您,您的工作是摆脱它并让它这样做。你不“知道你什么时候离开viewDidLoad”。您只需实现事件消息以在它们表示时执行适当的操作,不多也不少。
    【解决方案3】:

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

    【讨论】:

    • 有什么方法可以让我在做一些逻辑的同时继续显示启动屏幕?我不希望启动屏幕在逻辑完成之前消失。
    • @Recusiwe 这是一个很好的问题,我真的不知道答案。我猜这取决于逻辑在哪里,appDelegate 还是在视图控制器中,但这只是一个猜测
    • 是的,我想在 appDelegate 中做一些逻辑,根据逻辑的结果,我想显示一个特定的视图控制器。
    • @Recusiwe 是的,你有没有在你的代码中实现我的答案。它会这样做
    • “我不喜欢在数据准备好时显示未完成的表格,但我会重新考虑”这就是我建议你做的事情。您可以在此期间显示其他内容,但它不能是 LaunchScreen.storyboard,而您的应用程序正在启动它的轮子。您必须快速启动。希望有帮助。 (PS 有一个关于这个主题的 WWDC 视频。)
    【解决方案4】:

    不,您不能为launchScreen.Storyboard 编码,原因是:- 当您的launchScreen.storyboard 显示应用仍在加载时。

    简单地说:当你的应用显示launchScreen.storyboard时你无法访问它,你所能做的就是制作一个不执行任何代码的UI/UX。

    替代方案:- 制作一个 viewController,作为第一个 viewController 检查您的逻辑并从那里相应地执行操作!

    参考:-https://stackoverflow.com/a/27642160/6297658

    【讨论】:

      【解决方案5】:

      您的 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
      }
      

      【讨论】:

        猜你喜欢
        • 2018-01-12
        • 2012-04-13
        • 2019-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多