我没有弄到我的代码有什么问题 . 我只是用"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)
}
UPDATE :当我在其他控制器中放入相同的代码时,它可以工作 . 在原始控制器中,在 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()
,只是为了设置屏幕 Headers .
5 回答
你在哪里叫做
UIApplication.shared.beginIgnoringInteractionEvents()
?如果是的那就是你的问题 .如果我们创建一个新的“单一视图”项目对于以下两种呈现警报的方式,我们会得到以下行为
在控制台中,您将看到
2017-08-15 16:27:35.871 test[66719:7754741] Warning: Attempt to present on whose view is not in the window hierarchy!
用户界面没有任何警报 .
并为:
每件事都按预期工作 .
是的,视图确实出现了这个地方 .
关于viewDidLoad()和viewDidAppear(_:)
从它的外观来看,问题在于beginIgnoringInteractionEvents
如果您在viewDidAppear上发出警报,您应该看到它但如果您没有看到它,请注意以下事项:
即使你把这段代码放在viewdidload中
it may get executed later (取决于解析何时完成)而不是viewDidAppear的调用,这是因为:
DispatchQueue.global(qos: .background).async
你检查了这个原因吗?
我在警报代码之前在
viewDidAppear()
中添加以下代码并开始工作 . 我在两个地方都保留了以下代码,即Async
电话以及viewDidAppear()
当您单击
OK
时,endIgnoringInteractionEvents()
处于异步方法中此方法避免't been called. so you can' t解除警报 .您的代码看起来很好,并且
viewDidAppear
很好,因为您的视图控制器将正确加载并且它赢得了't break the main thread to show you the alert. There' s应该是您的代码,(错误)Xcode或派生数据问题的一些其他问题 .您可以做一些事情来查看实际问题:
清洁构建
从派生数据中删除文件
从模拟器中删除应用程序
再次清洁
重新启动Xcode和Simulator
重建以查看它是否有效 .