Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从LaunchScreen切换到Main.Storyboard中的viewController?_Ios_Swift_Viewcontroller_Launch Screen - Fatal编程技术网

Ios 从LaunchScreen切换到Main.Storyboard中的viewController?

Ios 从LaunchScreen切换到Main.Storyboard中的viewController?,ios,swift,viewcontroller,launch-screen,Ios,Swift,Viewcontroller,Launch Screen,我想在启动屏幕中执行一些逻辑,如果检查正常,我想切换到viewController,如果没有,我想切换到另一个,这可能吗 不,您不能为启动屏幕.情节提要编码,原因是:-当您的启动屏幕.情节提要显示应用程序仍在加载时 简单地说:当你的应用程序显示启动屏幕时,你无法访问它。情节提要,你所能做的就是为它创建一个UI/UX,而不是为它执行任何代码。 备选方案:-制作一个显示为第一个viewController的viewController,在那里检查您的逻辑并相应地执行操作 参考:-运行您的签入didf

我想在启动屏幕中执行一些逻辑,如果检查正常,我想切换到viewController,如果没有,我想切换到另一个,这可能吗

不,您不能为
启动屏幕.情节提要
编码,原因是:-当您的
启动屏幕.情节提要
显示应用程序仍在加载时

简单地说:当你的应用程序显示
启动屏幕时,你无法访问它。情节提要
,你所能做的就是为它创建一个UI/UX,而不是为它执行任何代码。

备选方案:-制作一个显示为第一个viewController的
viewController
,在那里检查您的逻辑并相应地执行操作


参考:-

运行您的签入
didfishlaunchwithoptions()
并使用它直接“跳转”到特定的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()
        }
}

加载应用程序时将显示启动屏幕。转到您的
AppDelgate

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

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

    return true
}
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

    } 
}
我想在我的启动屏幕上做一些逻辑

现在我明白了这个问题,我可以回答:不要。稍后再做耗时的逻辑。你的任务是快速启动。您需要使用选项退出
ApplicationIDFinishLaunching,退出
viewDidLoad
,然后启动


你在那一点上展示什么取决于你;如果您有耗时的东西(在您的情况下,听起来像是在联网或在加载表的数据源时做其他需要时间的事情),并且您希望显示一个特殊的视图控制器,该控制器使用旋转的活动视图或其他什么来覆盖时间,那么很好。但在实际发射过程中并不是这样做的时候

将此函数添加到
AppDelegate

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

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

    return true
}
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
中的
didfishlaunchingwithoptions
方法中,您可以添加以下内容:

if currentUser != nil {

    initialVC("tabBarVC")

} else {

    initialVC("loginVC")

}
您可以在我的示例中看到,根据用户是否登录,我正在加载主应用程序VC或登录VC。在您的例子中,可以使用if-else语句并在
initialVC
函数中执行逻辑


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

LaunchScreen你是说LaunchSotryboard?或者它只是层次结构中的另一个viewController?它是LaunchScreen.storyboard。我想在Main.Storyboard中切换到一个特定的脚本。在执行一些逻辑操作时,是否有任何方法可以继续显示启动屏幕?我不想在逻辑完成之前启动屏幕消失。@Recusiwe这是个好问题,我真的不知道答案。我猜这取决于逻辑在哪里,appDelegate还是在视图控制器中,但这只是一个猜测。是的,我想在appDelegate中执行一些逻辑,根据逻辑的结果,我想显示一个特定的视图控制器。@Recusiwe是的,您在代码中实现了我的答案了吗。它可以做到“我不喜欢在数据准备好的时候显示未完成的表格,但我会重新考虑”这就是我建议您做的。您可以在此期间显示其他内容,但不能在应用程序启动时显示LaunchScreen.storyboard。你必须快速发射。希望有帮助。(还有一个关于这个主题的WWDC视频。)@SAHM这不是我们刚才讨论的吗?你不能发射。运行时正在启动您,您的工作是让路,让它这样做。您“不知道何时退出
viewDidLoad
”。您只需实现事件消息,就可以在它们表示的时刻执行适当的操作,不多也不少。