以编程方式Swift设置初始视图控制器

时间:2016-03-19 19:22:36

标签: ios swift storyboard

我在堆栈溢出时看到了很长的Objective-C答案,但没有快速的答案。

如何从swift中以编程方式更改初始视图控制器?

我认为它会是这样的:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
storyboard.setInitialViewController(identifier: ViewController())

但不,这没有做任何事情。第一行很好,但第二行的功能不存在。

3 个答案:

答案 0 :(得分:12)

要在视图控制器中而不是在app delegate中执行此操作:只需在视图控制器中获取对AppDelegate的引用,并使用右视图控制器重置其窗口对象它是rootviewController。

第1步:制作一些用户可以调整的NSUserDefaults。几个按钮,表视图中的一些开关,一些东西。然后,当用户点击按钮时,我们会更改NSUserDefault。

@IBAction func SwitchLaunchViewtoViewController2(sender: AnyObject) {
  defaults.setObject("ViewController2", forKey: "LaunchView")
}
@IBAction func SwitchLaunchViewtoViewController1(sender: AnyObject) {
  defaults.setObject("ViewController1", forKey: "LaunchView")
}

将设置视图控制器中的几个按钮挂钩到这些功能,我们已经启动了。

第2步:为您希望能够设置为启动视图的所有故事板设置故事板ID。因此,对于每个可能是初始视图控制器的View Controller:

- 进入你的故事板。

- 点击视图控制器。

- 在右侧边栏中,点击您可以控制班级的类似报纸的图标。

- 在#34;身份"部分(第三行),检查"使用故事板ID" (确保它已打开)然后键入类似" VC1"在"故事板ID"文本域。确保为每个视图控制器选择不同的Storyboard ID。

- 为每个视图控制器重复。

第3步:在AppDelegate.swift文件中设置初始视图控制器。进入应用代表的func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool部分。

添加此内容以从您之前创建的NSUserDefault中读取:

let defaults = NSUserDefaults.standardUserDefaults()
    if let launchview = defaults.stringForKey("LaunchView")
    {

}

这会查找名为" LaunchView"的NSUserDefault字符串。 (您在步骤1中创建的)如果找到匹配的NSUserDefault,则将其设置为新的变量launchview。

然后,在if let launchview...括号内,我们要检查您将LaunchView设置为的内容。对于您在步骤1中设置为LaunchView的每个对象(在示例中,我执行了"ViewController2""ViewController1"),您必须在此处进行检查。因此,在这些括号内,我们添加:

if launchview == "ViewController2" {

} else if launchview == "ViewController1" {

}

然后,在每个if语句中,我们添加以下代码:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) // this assumes your storyboard is titled "Main.storyboard"
let yourVC = mainStoryboard.instantiateViewControllerWithIdentifier("YOUR_VC_IDENTIFIER") as! YourViewController // inside "YOUR_VC_IDENTIFIER" substitute the Storyboard ID you created in step 2 for the view controller you want to open here. And substitute YourViewController with the name of your view controller, like, for example, ViewController2.
appDelegate.window?.rootViewController = yourVC
appDelegate.window?.makeKeyAndVisible()

当应用程序在后台运行一段时间后完成加载时,这将打开所选窗口。

AppDelegate的完成didFinishLoadingWithOptions部分可能如下所示: (不要只是复制和粘贴,阅读上面的说明)

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

let defaults = NSUserDefaults.standardUserDefaults()
        if let launchview = defaults.stringForKey("LaunchView")
        {

            if launchview == "ViewController1" {

        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("VC1") as! ViewController1
        appDelegate.window?.rootViewController = yourVC
        appDelegate.window?.makeKeyAndVisible()

            } else if launchview == "ViewController2" {
                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("VC1") as! ViewController1
                appDelegate.window?.rootViewController = yourVC
                appDelegate.window?.makeKeyAndVisible()
            }

        }

        return true
   }

我希望这会对你有所帮助,并且非常感谢Ankit Goel,他帮我解决了这个问题。请阅读下面的评论以获取更多信息。

最后一个注意事项:如果您在设置视图中使用了开关,请确保您在该设置视图控制器的viewDidLoad中从NSUserDefault LaunchView读取用户最后选择的那个。

答案 1 :(得分:7)

针对Swift 3进行了更新

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.makeKeyAndVisible()

    window?.rootViewController = UINavigationController(rootViewController: ViewController())

    return true
}

答案 2 :(得分:2)

首先,可以使用问题中公开的代码在application:didFinishLaunchingWithOptions:中以编程方式设置应用的初始视图控制器:

您可以根据条件管理您想要的所有条件,以显示一个或另一个UIViewController

例如,让我们说您希望在您的应用中仅在第一次安装应用时显示演练,之后再浏览另一个登录屏幕,然后再显示另一个,但您只在第一次显示演练时以前没有记录的登录和另一个登录。

当然,这可以用几种方式处理,我只是试着向你解释一下制作方法。

为此您可以设置一个名为 SplashViewController 的控制器,例如,它是您的初始UIViewController,并在其中显示应用程序的图像(大图像徽标,当你去一个地方或另一个地方时,你的过程。通过这种方式,您可以清理AppDelegate内部的代码,并且可以更轻松地对其进行单元测试。

现在,如果您想从另一个UIViewController内转到另一个UIViewController,可以使用以下代码执行此操作:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewControllerWithIdentifier("ControllerName") as! ControllerName
self.presentViewController(viewController, animated: true, completion: nil)

我希望这对你有所帮助。