我有一个UIAlertController在我的项目中运行,它通过UIButton连接。我的代码工作正常。但是,每当我按下按钮Xcode控制台打印如下警告时,我经历了所有类似的问题,在stackOverflow中被问到但是没有回答。Attempt to present UIAlertController on UIViewController whose view is not in the window hierarchy
2016-10-03 19:14:35.854 xxxxxx[85186:7214348] Warning: Attempt to present<UIAlertController: 0x7f8d99450820> on <yyyyyyy.ViewController: 0x7f8d9a025200> which is already presenting (null)
我的代码如下:
override func viewDidLoad() {
super.viewDidLoad()
self.moreButton.frame = CGRect(x:view.frame.width / 2, y: view.frame.height / 2, width: 100, height: 40)
moreButton.center = view.center
moreButton.backgroundColor = UIColor.darkText.withAlphaComponent(0.4)
moreButton.layer.masksToBounds = true
moreButton.setTitle("More", for: UIControlState())
moreButton.setTitleColor(UIColor.white, for: UIControlState())
moreButton.showsTouchWhenHighlighted = true
moreButton.layer.cornerRadius = 5.0
moreButton.addTarget(self, action: #selector(ViewController.moreButtonAction(_:)), for: .allTouchEvents)
self.view.addSubview(self.moreButton)
}
func moreButtonAction(_ sender: UIButton) {
DispatchQueue.main.async(execute: {
let myAlert = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.actionSheet)
myAlert.view.tintColor = UIColor.purple.withAlphaComponent(0.8)
let myAction_1 = UIAlertAction(title: " Title 1", style: UIAlertActionStyle.default, handler: {
(action: UIAlertAction!) in
})
let myAction_2 = UIAlertAction(title: " Title 2", style: UIAlertActionStyle.default, handler: {
(action: UIAlertAction!) in
})
let myAction_3 = UIAlertAction(title: " Title 3", style: UIAlertActionStyle.default, handler: {
(action: UIAlertAction!) in
})
let myAction_4 = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: {
(action: UIAlertAction!) in
})
myAlert.addAction(myAction_1)
myAlert.addAction(myAction_2)
myAlert.addAction(myAction_3)
myAlert.addAction(myAction_4)
self.present(myAlert, animated: true, completion: nil)
})
}
先谢谢
答案 0 :(得分:1)
该错误告诉您,您正在尝试展示已经有效的alertController
。您可以检查控制器是否有活动警报,否则显示它。这将删除警告。所以基本上使用以下内容移动self.present row
:
if !(self.navigationController?.visibleViewController?.isKind(of: UIAlertController.self))! {
self.present(myAlert, animated: true, completion: nil)
}
将moreActionButton
功能替换为以下内容:
func moreButtonAction(_ sender: UIButton) {
let myAlert = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.actionSheet)
myAlert.view.tintColor = UIColor.purple.withAlphaComponent(0.8)
let myAction_1 = UIAlertAction(title: " Title 1", style: UIAlertActionStyle.default, handler: {
(action: UIAlertAction!) in
})
let myAction_2 = UIAlertAction(title: " Title 2", style: UIAlertActionStyle.default, handler: {
(action: UIAlertAction!) in
})
let myAction_3 = UIAlertAction(title: " Title 3", style: UIAlertActionStyle.default, handler: {
(action: UIAlertAction!) in
print("3")
})
let myAction_4 = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: {
(action: UIAlertAction!) in
})
myAlert.addAction(myAction_1)
myAlert.addAction(myAction_2)
myAlert.addAction(myAction_3)
myAlert.addAction(myAction_4)
if !(self.navigationController?.visibleViewController?.isKind(of: UIAlertController.self))! {
self.present(myAlert, animated: true, completion: nil)
}
}