UiAlertView或UiAlertController只能在Swift中显示一次

时间:2015-02-02 20:16:46

标签: swift uialertview uialertcontroller

如何让我的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()

}

3 个答案:

答案 0 :(得分:4)

Bool命令下声明一个全局import变量:

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
    }
}

答案 1 :(得分:3)

我修改了此线程中的代码,以便允许用户“不再显示此消息”。基本上,显示警报并使用户能够在将来禁用警报。

代码如下:

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/

引用文章:

  

请注意,我试图在其中呈现UIAlertController   class的viewDidLoad函数。这就是问题所在。你明白了   点,视图已加载,但尚未出现。我相信   这就是为什么警告是指“分离的视图控制器”。

     

我找到的解决方案是显示视图控制器不在   viewDidLoad函数,而是在viewDidAppear函数中。在   该点已加载并正在显示。

所以我更新了我的代码并将相关的块移到了viewDidAppear部分,一切都很顺利。没有错误。

答案 2 :(得分:0)

  

只需在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()}