我的代码没有出错。我只是用“确定”按钮显示警报,当用户点击“确定”时,警报就会响起。但它并没有消失。使用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()
,只是为了设置屏幕标题。
答案 0 :(得分:1)
如果我们创建一个新的“单一视图”项目 对于以下两种呈现警报的方式,我们得到以下行为
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 test [66719:7754741]警告:尝试显示其视图不在窗口层次结构中!
并且用户界面没有任何提醒。
和for:
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()和viewDidAppear(_:)
从它的外观来看问题就在于此 beginIgnoringInteractionEvents
如果您将警报放在 viewDidAppear 上,您应该会看到它,但如果您没有看到它,请注意以下事项:
即使您将这段代码放在 viewdidload
中 DispatchQueue.main.async {
self.activityIndicator.stopAnimating()
UIApplication.shared.endIgnoringInteractionEvents()
//Other UI update operation
}
以后可能会执行(取决于解析何时完成)而不是 viewDidAppear 的调用 这是因为:
DispatchQueue.global(qos:.background).async
你检查了这个原因吗?
答案 1 :(得分:1)
我在警报代码之前在viewDidAppear()
中添加以下代码并开始工作。我在两个位置都保留了代码,即Async
调用以及viewDidAppear()
self.activityIndicator.stopAnimating()
UIApplication.shared.endIgnoringInteractionEvents()
答案 2 :(得分:0)
endIgnoringInteractionEvents()
尚未调用此方法时, OK
处于异步方法中。所以你不能解雇警报。
答案 3 :(得分:-2)
您的代码看起来很好,并且viewDidAppear
很好,因为您的视图控制器将正确加载,并且它不会破坏主线程以向您显示警报。您的代码应该存在其他一些问题(Xcode的错误或派生数据问题。
您可以做一些事情来查看实际问题: