使用以下代码挣扎:
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)
}
我做错了什么?
答案 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)
- 永远不会显示UIAlertController,"您好"一遍又一遍地打印
醇>
不合适继续在无尽的while
循环中呈现提醒,可能会导致面对" AlertController is not in the window hierarchy"问题。
- 如果我插入" connected = true"在while子句之后然后显示UIAlertController,但是我无法再显示它 将操作更改为" connected = false"
醇>
当然,默认情况下你无法再次显示它,代码块已经被执行了。
<强>解决方案:强>
提示警报应与触发特定条件有关,而不是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")
}
}