如何使 uiviewcontroller 在应用程序首次运行期间仅可见一次(例如教程)?

Posted

技术标签:

【中文标题】如何使 uiviewcontroller 在应用程序首次运行期间仅可见一次(例如教程)?【英文标题】:how can I make the uiviewcontroller visible only once during first run of the app (e.g. tutorial)? 【发布时间】:2017-01-14 03:23:54 【问题描述】:

我正在创建一个 ios swift 应用程序,我想在用户第一次运行该应用程序时显示教程屏幕。稍后,随着应用程序的每次运行,教程应该被隐藏,另一个视图控制器应该作为起点可见。到目前为止,我的情节提要如下所示:

它包含两个屏幕教程(第一个和最后一个)和标签栏(这是我的应用程序的主窗口)。

就目前而言,在故事板中,我选择标签栏作为初始视图控制器:

通过这种方法,教程屏幕永远不会出现。如何在首次启动应用时仅显示一次,然后在每次用户打开应用时跳过它?

【问题讨论】:

好的,谢谢你的建议!但是如何根据 bool 标志决定是否显示屏幕?我应该从哪里做呢? 您可以签入您的应用委托,然后在那里设置根视图控制器。 @ChrisSlowik 你能给我看一个我可以使用的代码示例吗?我尝试使用:let vc : AnyObject! = self.storyboard!.instantiateViewControllerWithIdentifier("tutorialFirst") self.showViewController(vc as! UIViewController, sender: vc),但我的屏幕没有改变 【参考方案1】:

AppDelegatedidFinishLaunchingWithOptions 方法中检查NSUserDefaults 值这样的方式。

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

    let defaults = NSUserDefaults.standardUserDefaults()
    if defaults.objectForKey("isFirstTime") == nil 
         defaults.setObject("No", forKey:"isFirstTime")
         let storyboard = UIStoryboard(name: "main", bundle: nil) //Write your storyboard name
         let viewController = storyboard.instantiateViewControllerWithIdentifier("ViewController") as! ViewController
         self.window.rootViewController = viewController 
         self.window.makeKeyAndVisible()
    
    return true

注意:我已经创建了ViewController 的对象,您需要创建FirstPage 教程屏幕的对象,然后将其分配给rootViewController

【讨论】:

嗯,我在这里遇到错误:let viewController = self.storyboard? 说“'AppDeleage' 类型的值没有成员'故事板' 我认为你不需要打电话给defaults.synchronize @LalKrishna 是的,现在我们不需要在每次更新或设置 UserDefaults 中的值时调用同步方法,它会自动同步【参考方案2】:

对于 swift 4 进行这些更改。

let defaults = UserDefaults.standard
if defaults.object(forKey: "isFirstTime") == nil 
    defaults.set("No", forKey:"isFirstTime")
    defaults.synchronize()
    ...

【讨论】:

【参考方案3】:

此答案的简化 Swift 4 版本。

https://***.com/a/39353299/1565913

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

    if !UserDefaults.standard.bool(forKey: "didSee") 
         UserDefaults.standard.set(true, forKey: "didSee")

         let storyboard = UIStoryboard(name: "Main", bundle: nil) 
         let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewController")
         self.window?.rootViewController = viewController 
         self.window?.makeKeyAndVisible()
    

    return true

【讨论】:

【参考方案4】:

添加这是Scene Delegate

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
    guard let _ = (scene as? UIWindowScene) else  return 
    
    if UserDefaults.standard.bool(forKey: "introLaunched") == false
        UserDefaults.standard.set(true, forKey: "introLaunched")
        let storyboard = UIStoryboard(name: "Main", bundle: .main)
        let vc = storyboard.instantiateViewController(identifier: "IntroScreenViewController") as! IntroScreenViewController
        self.window?.rootViewController = UINavigationController(rootViewController: vc)
     else 
        let storyboard = UIStoryboard(name: "Main", bundle: .main)
        let vc = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
        self.window?.rootViewController = UINavigationController(rootViewController: vc)
    

【讨论】:

以上是关于如何使 uiviewcontroller 在应用程序首次运行期间仅可见一次(例如教程)?的主要内容,如果未能解决你的问题,请参考以下文章

跨进程加载的 DLL - 如何使某些操作“类似于单例”

如何使 UIViewController 工具栏出现? [关闭]

如何使 UIViewController 成为单独 UITableViewController 的委托?

如何在一个 UIViewController 中处理多个视图

在 UIViewController (iOS) 中重新启动绘图和事件

如果我在 UIScrollView 中有 UIViewController,如何以编程方式使 UIScrollview zoomToRect?