Swift:UIAlertController里面循环

时间:2017-09-10 13:15:36

标签: ios swift

使用以下代码挣扎:

 var connected = false
    while !connected {
        let msg = "Press cancel"
        let alert = UIAlertController(title: "Test", message: msg, preferredStyle: .alert)
        let action = UIAlertAction(title: "Cancel", style: .default) { (action:UIAlertAction) in
            connected = true
        }
        alert.addAction(action)
        print ("Hello")
        present(alert, animated: true, completion: nil)

    }
  1. 永远不会显示UIAlertController,反复打印“Hello”
  2. 如果我在while子句后插入“connected = true”,则会显示UIAlertController,但我无法通过将操作更改为“connected = false”来再次显示
  3. 我做错了什么?

3 个答案:

答案 0 :(得分:2)

首先,正如评论中所提到的,在一个while循环中连续呈现警报控制器并不是一个好主意。我相信您的预期功能是在connected变量变为假时显示警告。

要完成此操作,请使用NotificationCenter进行如下响应:

viewDidLoad

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.displayAlert), name: NSNotification.Name(rawValue: "connectionDropped"), object: nil)

willSet属性观察者添加到connected

var connected: Bool! {
  willSet {
    if newValue == false && oldValue != false {
      NotificationCenter.default.post(name: NSNotification.Name(rawValue: "connectionDropped"), object: nil)
    }
  }
}

然后,无论何时设置self.connected = false,您都将运行此方法:

@objc func displayAlert() {
  let msg = "Press cancel"
  let alert = UIAlertController(title: "Test", message: msg, preferredStyle: .alert)
  let action = UIAlertAction(title: "Cancel", style: .default) { (action:UIAlertAction) in
    self.connected = true
  }
  alert.addAction(action)
  print ("Hello")
  present(alert, animated: true, completion: nil)
}

只需确保在加载视图层次结构后设置连接,例如viewDidAppear

完成视图后,您可以删除观察者:

deinit {
  NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "connectionDropped"), object: nil)
}

编辑:

Reachability框架提供了您需要的功能,特别是reachabilityChanged通知。然后,您可以使用我在上面概述的类似方法调用displayAlert;这在他们的README文档中有记录。

答案 1 :(得分:0)

  
      
  1. 永远不会显示UIAlertController,"您好"一遍又一遍地打印
  2.   

不合适继续在无尽的while循环中呈现提醒,可能会导致面对" AlertController is not in the window hierarchy"问题。

  
      
  1. 如果我插入" connected = true"在while子句之后然后显示UIAlertController,但是我无法再显示它   将操作更改为" connected = false"
  2.   

当然,默认情况下你无法再次显示它,代码块已经被执行了。

<强>解决方案:

提示警报应与触发特定条件有关,而不是while循环。

例如,如果您的目标是通知用户设备未连接,您可以使用Reachability并观察reachabilityChanged以显示警报,有关详细信息,您可以检查库 - < strong>示例 - 通知部分。

答案 2 :(得分:0)

我设法使用对函数的递归调用来解决它:

    func showDlg(){
    ssid = getWiFiSsid() ?? "AAA"
    ssid = ssid[ssid.startIndex..<ssid.index(ssid.startIndex, offsetBy: 2)]
    if ssid != "GP" {
        print ("SSID: " + ssid)

        let msg = "\nNot connected to GoPro camera\n\nPlease connect to camera wireless network and revert\n "
        alert = UIAlertController(title: "GoPro Golfswing Analyser", message: msg, preferredStyle: .alert)
        let action = UIAlertAction(title: "Try again", style: .default) { (action:UIAlertAction) in
            print("Testing network again")
            self.showDlg()
        }
        alert.addAction(action)

        let action1 = UIAlertAction(title: "Cancel", style: .default) { (action:UIAlertAction) in
            print("Cancel - exiting")

        }
        alert.addAction(action1)

        present(alert, animated: true, completion: nil)

    } else{
        print("Connected to GoPro")
    }

}