UIAlertController没有消失

时间:2017-08-06 09:53:37

标签: ios swift3 uialertcontroller viewdidappear

我的代码没有出错。我只是用“确定”按钮显示警报,当用户点击“确定”时,警报就会响起。但它并没有消失。使用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(),只是为了设置屏幕标题。

4 个答案:

答案 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的错误或派生数据问题。

您可以做一些事情来查看实际问题:

  1. 清理构建
  2. 从派生数据中删除文件
  3. 从模拟器中删除应用
  4. 再次清洁
  5. 重新启动Xcode和Simulator
  6. 重建以确定它是否有效。