UIAlertController 没有消失

UIAlertController not disappearing

我没有发现我的代码有什么问题。我只是用 "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)  
}

更新: 当我将相同的代码放入其他控制器时,它起作用了。 在原始控制器中,在 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(),只是为了设置屏幕标题。

您的代码看起来不错,viewDidAppear 也不错,因为您的视图控制器将被正确加载,并且不会中断主线程来向您显示警报。您的代码应该有其他问题,Xcode 的(错误)或派生数据问题。

您可以做几件事来查看实际问题:

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

兄弟,你在哪儿打电话给 UIApplication.shared.beginIgnoringInteractionEvents() 吗??如果是,那是你的问题。

当您单击

endIgnoringInteractionEvents() 时,endIgnoringInteractionEvents() 处于异步方法中 OK 此方法尚未被调用。所以你不能关闭警报。

如果我们创建一个新的 "single view" 项目 对于以下两种呈现警报的方式,我们得到以下行为

    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 测试[66719:7754741] 警告:试图呈现其视图不在 window 层次结构中!

并且 UI 上没有警报。

以及:

   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() and viewDidAppear(_:)

看来问题出在 beginIgnoringInteractionEvents

如果您将警报放在 viewDidAppear 上,您应该会看到它,但如果您没有看到它,请注意以下事项:

就算把这段代码放在viewdidload

        DispatchQueue.main.async {

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

            //Other UI update operation

        }

它可能比 viewDidAppear 的调用晚(取决于解析何时完成)执行 这是因为:

DispatchQueue.global(qos: .background).async

这个原因你查了吗?

我在 viewDidAppear() 中的警报代码之前添加了以下代码,它开始工作了。我在两个位置都保留了以下代码,即在 Async 调用以及 viewDidAppear()

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