UIAlertController 没有消失
UIAlertController not disappearing
我没有发现我的代码有什么问题。我只是用 "Ok" 按钮显示警报,当用户单击 "Ok" 时,警报应该消失。但它并没有消失。使用 Swift3 进行编程。 viewDidAppear()
是放置此代码的正确位置吗?还是我做错了什么?
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alertController, animated: true, completion: nil)
}
更新:
当我将相同的代码放入其他控制器时,它起作用了。
在原始控制器中,在 viewDidLoad() 中,我有一个如下所示的 Async
调用。这个问题是因为那个吗?
DispatchQueue.global(qos: .background).async {
self.getDetails(onCompletion: {(json: JSON) in
let dict = self.convertToDictionary(text: json.stringValue)
DispatchQueue.main.async {
self.activityIndicator.stopAnimating()
UIApplication.shared.endIgnoringInteractionEvents()
//Other UI update operation
}
})
}
我还覆盖了 viewWillDisappear()
和 viewWillAppear()
,只是为了设置屏幕标题。
您的代码看起来不错,viewDidAppear
也不错,因为您的视图控制器将被正确加载,并且不会中断主线程来向您显示警报。您的代码应该有其他问题,Xcode 的(错误)或派生数据问题。
您可以做几件事来查看实际问题:
- 清理构建
- 从派生数据中删除文件
- 从模拟器中删除应用程序
- 再次清洁
- 重启Xcode和模拟器
- 重建以查看它是否有效。
兄弟,你在哪儿打电话给 UIApplication.shared.beginIgnoringInteractionEvents()
吗??如果是,那是你的问题。
当您单击 endIgnoringInteractionEvents()
时,endIgnoringInteractionEvents()
处于异步方法中 OK
此方法尚未被调用。所以你不能关闭警报。
如果我们创建一个新的 "single view" 项目
对于以下两种呈现警报的方式,我们得到以下行为
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alertController, animated: true, completion: nil)
}
在控制台中你会看到
2017-08-15 16:27:35.871 测试[66719:7754741] 警告:试图呈现其视图不在 window 层次结构中!
并且 UI 上没有警报。
以及:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alertController, animated: true, completion: nil)
}
一切都按预期进行。
所以是的,确实出现了这个地方。
关于viewDidLoad() and viewDidAppear(_:)
看来问题出在
beginIgnoringInteractionEvents
如果您将警报放在 viewDidAppear 上,您应该会看到它,但如果您没有看到它,请注意以下事项:
就算把这段代码放在viewdidload
DispatchQueue.main.async {
self.activityIndicator.stopAnimating()
UIApplication.shared.endIgnoringInteractionEvents()
//Other UI update operation
}
它可能比 viewDidAppear 的调用晚(取决于解析何时完成)执行
这是因为:
DispatchQueue.global(qos: .background).async
这个原因你查了吗?
我在 viewDidAppear()
中的警报代码之前添加了以下代码,它开始工作了。我在两个位置都保留了以下代码,即在 Async
调用以及 viewDidAppear()
中
self.activityIndicator.stopAnimating()
UIApplication.shared.endIgnoringInteractionEvents()
我没有发现我的代码有什么问题。我只是用 "Ok" 按钮显示警报,当用户单击 "Ok" 时,警报应该消失。但它并没有消失。使用 Swift3 进行编程。 viewDidAppear()
是放置此代码的正确位置吗?还是我做错了什么?
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alertController, animated: true, completion: nil)
}
更新:
当我将相同的代码放入其他控制器时,它起作用了。
在原始控制器中,在 viewDidLoad() 中,我有一个如下所示的 Async
调用。这个问题是因为那个吗?
DispatchQueue.global(qos: .background).async {
self.getDetails(onCompletion: {(json: JSON) in
let dict = self.convertToDictionary(text: json.stringValue)
DispatchQueue.main.async {
self.activityIndicator.stopAnimating()
UIApplication.shared.endIgnoringInteractionEvents()
//Other UI update operation
}
})
}
我还覆盖了 viewWillDisappear()
和 viewWillAppear()
,只是为了设置屏幕标题。
您的代码看起来不错,viewDidAppear
也不错,因为您的视图控制器将被正确加载,并且不会中断主线程来向您显示警报。您的代码应该有其他问题,Xcode 的(错误)或派生数据问题。
您可以做几件事来查看实际问题:
- 清理构建
- 从派生数据中删除文件
- 从模拟器中删除应用程序
- 再次清洁
- 重启Xcode和模拟器
- 重建以查看它是否有效。
兄弟,你在哪儿打电话给 UIApplication.shared.beginIgnoringInteractionEvents()
吗??如果是,那是你的问题。
endIgnoringInteractionEvents()
时,endIgnoringInteractionEvents()
处于异步方法中 OK
此方法尚未被调用。所以你不能关闭警报。
如果我们创建一个新的 "single view" 项目 对于以下两种呈现警报的方式,我们得到以下行为
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alertController, animated: true, completion: nil)
}
在控制台中你会看到
2017-08-15 16:27:35.871 测试[66719:7754741] 警告:试图呈现其视图不在 window 层次结构中!
并且 UI 上没有警报。
以及:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alertController, animated: true, completion: nil)
}
一切都按预期进行。
所以是的,确实出现了这个地方。
关于viewDidLoad() and viewDidAppear(_:)
看来问题出在 beginIgnoringInteractionEvents
如果您将警报放在 viewDidAppear 上,您应该会看到它,但如果您没有看到它,请注意以下事项:
就算把这段代码放在viewdidload
DispatchQueue.main.async {
self.activityIndicator.stopAnimating()
UIApplication.shared.endIgnoringInteractionEvents()
//Other UI update operation
}
它可能比 viewDidAppear 的调用晚(取决于解析何时完成)执行 这是因为:
DispatchQueue.global(qos: .background).async
这个原因你查了吗?
我在 viewDidAppear()
中的警报代码之前添加了以下代码,它开始工作了。我在两个位置都保留了以下代码,即在 Async
调用以及 viewDidAppear()
self.activityIndicator.stopAnimating()
UIApplication.shared.endIgnoringInteractionEvents()