如何使 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】:
在AppDelegate
的didFinishLaunchingWithOptions
方法中检查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 在应用程序首次运行期间仅可见一次(例如教程)?的主要内容,如果未能解决你的问题,请参考以下文章
如何使 UIViewController 工具栏出现? [关闭]
如何使 UIViewController 成为单独 UITableViewController 的委托?
如何在一个 UIViewController 中处理多个视图
在 UIViewController (iOS) 中重新启动绘图和事件
如果我在 UIScrollView 中有 UIViewController,如何以编程方式使 UIScrollview zoomToRect?