首页 文章

UIAlertController没有消失

提问于
浏览
6

我没有弄到我的代码有什么问题 . 我只是用"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 回答

  • 5

    你在哪里叫做 UIApplication.shared.beginIgnoringInteractionEvents() ?如果是的那就是你的问题 .

  • -2

    如果我们创建一个新的“单一视图”项目对于以下两种呈现警报的方式,我们会得到以下行为

    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] Warning: Attempt to present on whose view is not in the window hierarchy!

    用户界面没有任何警报 .

    并为:

    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
    
            }
    

    it may get executed later (取决于解析何时完成)而不是viewDidAppear的调用,这是因为:

    DispatchQueue.global(qos: .background).async

    你检查了这个原因吗?

  • 1

    我在警报代码之前在 viewDidAppear() 中添加以下代码并开始工作 . 我在两个地方都保留了以下代码,即 Async 电话以及 viewDidAppear()

    self.activityIndicator.stopAnimating()
    UIApplication.shared.endIgnoringInteractionEvents()
    
  • 1

    当您单击 OK 时, endIgnoringInteractionEvents() 处于异步方法中此方法避免't been called. so you can' t解除警报 .

  • 0

    您的代码看起来很好,并且 viewDidAppear 很好,因为您的视图控制器将正确加载并且它赢得了't break the main thread to show you the alert. There' s应该是您的代码,(错误)Xcode或派生数据问题的一些其他问题 .

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

    • 清洁构建

    • 从派生数据中删除文件

    • 从模拟器中删除应用程序

    • 再次清洁

    • 重新启动Xcode和Simulator

    • 重建以查看它是否有效 .

相关问题