警告 - 尝试在Swift中显示UIAlertController null

时间:2016-10-03 09:09:06

标签: ios swift uialertcontroller

我有一个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)

    })
}

先谢谢

1 个答案:

答案 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)
    }
}