如何仅在应用程序第一次运行时在我的 iOS 应用程序中打开页面视图控制器?

Posted

技术标签:

【中文标题】如何仅在应用程序第一次运行时在我的 iOS 应用程序中打开页面视图控制器?【英文标题】:How to open a page view controller in my iOS app only the first time the app runs? 【发布时间】:2016-05-05 22:58:04 【问题描述】:

我正在为 ios 创建一个应用程序,我想打开一个页面视图控制器(不是普通视图控制器),但仅在用户第一次打开应用程序时。

问题是我无法在代码中打开新的页面视图控制器。用户将看到的第一个屏幕是登录屏幕,但在第一次访问时切换到页面视图控制器。

这是我目前在登录屏幕视图控制器中的内容:

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let launchedBefore = NSUserDefaults.standardUserDefaults().boolForKey("launchedBefore")
    if launchedBefore  
        //Not the first time, show login screen.
    
    else 
        NSUserDefaults.standardUserDefaults().setBool(true, forKey: "launchedBefore")
        //First time, open a new page view controller.
    
    let secondViewController:InstructionViewController = InstructionViewController()

    self.presentViewController(secondViewController, animated: true, completion: nil)

我要打开的页面视图控制器已在情节提要上创建。

【问题讨论】:

你已经接近了,在你完成任何 rootViewController 设置后,你会希望在应用程序委托方法 didFinishLaunchingWithOptions 中显示视图控制器。 【参考方案1】:

通过其他答案,我能够解决问题。

在 appDeligate 文件中,您需要将第一个函数替换为:

var window: UIWindow?
var storyboard:UIStoryboard?

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

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

    let launchedBefore = NSUserDefaults.standardUserDefaults().boolForKey("launchedBefore")

    if launchedBefore  
        //Not the first time, show login screen.
        storyboard = UIStoryboard(name: "Main", bundle: nil)
        let rootController = storyboard!.instantiateViewControllerWithIdentifier("Login")

        if let window = self.window 
            window.rootViewController = rootController
        

    
    else 
        NSUserDefaults.standardUserDefaults().setBool(true, forKey: "launchedBefore")
        //First time, open a new page view controller.
        storyboard = UIStoryboard(name: "Main", bundle: nil)
        let rootController = storyboard!.instantiateViewControllerWithIdentifier("Instruction")

        if let window = self.window 
            window.rootViewController = rootController
        
    

    return true

“登录”和“指令”是(页面)视图控制器的名称。

我不确定这是否是最健壮的代码,但它对我来说很好。

【讨论】:

我认为您还应该通过删除 plist 文件中的条目来禁用(默认)主故事板的自动加载。【参考方案2】:

App 代理的 willFinishLaunchingWithOptions 方法将是最佳位置 (AFAIK)。检查条件并相应地设置窗口的根视图控制器。

【讨论】:

如果您需要更多详细信息,请告诉我 作为一个XCode的初学者,我真的不知道从哪里开始,有没有例子可用? 非常感谢,遇到了困难但成功了:)【参考方案3】:

这是 Lesley 更新到 Swift 3 的代码:

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

    let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")

    if launchedBefore  
        //Not the first time, show login screen.
        storyboard = UIStoryboard(name: "Main", bundle: nil)
        let rootController = storyboard!.instantiateViewController(withIdentifier: "webView")

        if let window = self.window 
            window.rootViewController = rootController
        

    
    else 
        UserDefaults.standard.set(true, forKey: "launchedBefore")
        //First time, open a new page view controller.
        storyboard = UIStoryboard(name: "Main", bundle: nil)
        let rootController = storyboard!.instantiateViewController(withIdentifier: "progressView")

        if let window = self.window 
            window.rootViewController = rootController
        
    

别忘了设置

var storyboard:UIStoryboard?

在 didFinishLaunchingWithOptions 之前,并设置类似于您自己的视图控制器标识符的标识符。

【讨论】:

以上是关于如何仅在应用程序第一次运行时在我的 iOS 应用程序中打开页面视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 iOS 应用程序仅在首次运行时正确检测到当前语言?

今日 iOS 小部件仅在调试时显示

IOS模拟器问题应用程序仅在第二次启动时运行..

仅在我的 iOS 应用程序中将 tesseract 字符限制为 a-z 和数字

如何在应用程序运行 ios 时在后台进行服务调用

我的应用推送通知仅在我客户的 iPhone 上不起作用