UiAlertView 或 UiAlertController 在 Swift 中仅显示一次

Posted

技术标签:

【中文标题】UiAlertView 或 UiAlertController 在 Swift 中仅显示一次【英文标题】:UiAlertView or UiAlertController to display only once in Swift 【发布时间】:2015-02-02 20:16:45 【问题描述】:

如何让我的 UiAlertControllerUIAlertView 在 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 窗口

UIAlertView 隐藏/删除时调用的通知或委托

如何为 uialertview 或 UIAlertController 中的特定单词着色? (迅速)

如何观察何时显示 UIAlertView?

Swift UIAlertView/UIActionSheet