UiAlertView 或 UiAlertController 在 Swift 中仅显示一次
Posted
技术标签:
【中文标题】UiAlertView 或 UiAlertController 在 Swift 中仅显示一次【英文标题】:UiAlertView or UiAlertController to display only once in Swift 【发布时间】:2015-02-02 20:16:45 【问题描述】:如何让我的 UiAlertController
或 UIAlertView
在 Swift 中只显示一次?
override func viewDidLoad()
var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
if let nameIsNotNill = defaults.objectForKey("name") as? String
self.name.text = defaults.objectForKey("name") as String
if let phoneIsNotNill = defaults.objectForKey("phone") as? String
self.phone.text = defaults.objectForKey("phone") as String
var alert = UIAlertController(title: "Disclaimer", message: "WE STRIVES TO PROVIDE ACCURATE, UP-TO-DATE INFORMATION ON THIS APPS.", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Agree", style: UIAlertActionStyle.Default, handler: nil))
alert.addAction(UIAlertAction(title: "Disagree", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
super.viewDidLoad()
【问题讨论】:
你说的“只有一次”是什么意思?您实际上是将代码放入viewDidLoad
方法中,这意味着每次加载视图时都会显示警报。考虑仅在按下按钮时执行代码。
我希望 uialertview 在页面加载后自动加载,但只显示一次。我不想在按下按钮时显示 uialertview。基本上,在加载应用程序时,用户首先看到的是免责声明。一旦按下确定按钮,免责声明将不再出现。
看看我的回答。
【参考方案1】:
在import
命令下声明一个全局Bool
变量:
var justOnce:Bool = true
你应该这样使用它:
override func viewDidLoad()
super.viewDidLoad()
var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
if let nameIsNotNill = defaults.objectForKey("name") as? String
name.text = defaults.objectForKey("name") as String
if let phoneIsNotNill = defaults.objectForKey("phone") as? String
phone.text = defaults.objectForKey("phone") as String
if justOnce
var alert = UIAlertController(title: "Disclaimer", message: "WE STRIVES TO PROVIDE ACCURATE, UP-TO-DATE INFORMATION ON THIS APPS.", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Agree", style: UIAlertActionStyle.Default, handler: nil))
alert.addAction(UIAlertAction(title: "Disagree", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
justOnce = false
【讨论】:
我在 justOnce = false 下遇到编译器错误。 Swift 错误:无法分配给 'let' 值 'just Once' 如果 justOnce == true 是多余的。你为什么不写 if justOnce ... @Coder:使用var
而不是let
。我的错。我编辑了我的答案。
你不需要使用 == true 或 == false【参考方案2】:
我修改了此线程中的代码,以允许用户“不再显示此消息”。本质上,显示警报并让用户能够在将来禁用警报。
代码如下:
override func viewDidLoad()
super.viewDidLoad()
....
let AlertOnce = NSUserDefaults.standardUserDefaults()
if(!AlertOnce.boolForKey("oneTimeAlert"))
let alert = UIAlertController(title: "Note:", message: "Some message to be displayed on screen to the user", preferredStyle: UIAlertControllerStyle.Alert)
let DoNotShowAgainAction = UIAlertAction(title: "Do Not Show Again", style: UIAlertActionStyle.Default) (action:UIAlertAction) in
AlertOnce.setBool(true , forKey: "oneTimeAlert")
AlertOnce.synchronize()
let cancelAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel)
UIAlertAction in
alert.removeFromParentViewController()
alert.addAction(cancelAction)
alert.addAction(DoNotShowAgainAction)
self.presentViewController(alert, animated: true, completion: nil)
....
我将它放在相关 UIViewController 的 viewDidLoad()
部分中,以便在页面的初始视图/调用时加载。
希望这对有类似需求的人有所帮助。
欢迎评论和修改;)
**** 更新 ****
我在测试时遇到错误 -
“在分离的视图控制器上呈现视图控制器是 气馁”
我发现这篇出色的帖子帮助我解决了这个问题:http://timdietrich.me/blog/swift-presenting-view-controllers-on-detached-view-controllers-is-discouraged/
引用文章:
请注意,我试图在 类的 viewDidLoad 函数。这就是问题所在。你看,那时 点,视图已加载,但尚未出现。我相信 这就是警告指的是“分离的视图控制器”的原因。
我找到的解决方案是显示视图控制器不在 viewDidLoad 函数,而是在 viewDidAppear 函数中。在 视图已加载并正在显示的那一点。
所以我更新了我的代码并将相关块移动到viewDidAppear
部分,一切都很好。没有错误。
【讨论】:
【参考方案3】:只需将此代码添加到 AppDelegate.swift 文件中,它就可以在一次 alertview 中完美运行
=======
let AlertOnce = NSUserDefaults.standardUserDefaults() if(!changeAlert.boolForKey("oneTimeAlert")) var alert = UIAlertView() alert.title = "Welcome" alert.message = "welcome message" alert.addButtonWithTitle("OK") alert.delegate = self alert.show() AlertOnce.setBool(true , forKey: "oneTimeAlert") AlertOnce.synchronize()
【讨论】:
以上是关于UiAlertView 或 UiAlertController 在 Swift 中仅显示一次的主要内容,如果未能解决你的问题,请参考以下文章
UiAlertView 或 UiAlertController 在 Swift 中仅显示一次
当应用程序关闭或在后台运行时弹出 UIAlertView 窗口