【问题标题】:UIAlertController not disappearingUIAlertController 没有消失
【发布时间】:2017-08-06 09:53:37
【问题描述】:

我没有发现我的代码有什么问题。我只是用“确定”按钮显示警报,当用户单击“确定”时,警报应该会消失。但它并没有消失。使用 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(),只是为了设置屏幕标题。

【问题讨论】:

  • 你的代码很好,很正确,对我来说也很完美
  • 奇怪。它不适合我。 :(
  • 清理并运行一次
  • :( ....还是不行
  • @UmarFarooque 两件事:(1)不要在标题中添加标签;这就是标签部分的用途。其次,如果您提出修改建议,请尝试修复帖子中的所有 问题 - 或者至少不要只是在标题中移动内容。谢谢,希望能见到你! :)

标签: ios swift3 uialertcontroller viewdidappear


【解决方案1】:

你在任何地方打电话给UIApplication.shared.beginIgnoringInteractionEvents() 吗?如果是,那是你的问题。

【讨论】:

  • 是的。我在那个控制器中有它,以确保用户在加载时不能点击 UI。但是我也有 UIApplication.shared.endIgnoringInteractionEvents() 可以在 viewDidLoad() 的异步调用中结束它。并且警报代码在 viewDidAppear()
  • 我也认为是这个问题,看你在后台使用队列,所以它的完成优先级很低。这也将补充一个事实,即当您的活动指示器在屏幕上时可以显示警报。
  • 我的建议,(我假设您真的只想在加载时读取您的 json,并希望在显示屏幕时触发警报,即使它是在返回中)把在特定函数中调用警报,并在结束忽略后在 viewdidload 中调用它并在 viewdidappear 中显示。创建一个变量,该变量将用作一个标志来控制警报是否由 viewdidload 调用,因此不应由 viewdidappear 调用。
【解决方案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] 警告:尝试显示不在窗口层次结构中的视图!

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

从表面上看,问题出在 beginIgnoringInteractionEvents

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

即使你把这段代码放在viewdidload

        DispatchQueue.main.async {

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

            //Other UI update operation

        }

它可能会在调用 viewDidAppear 之后执行(取决于解析完成的时间) 这是因为:

DispatchQueue.global(qos: .background).async

你检查过这个原因吗?

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 虽然这有帮助,但它并不是真正的答案,最好作为对帮助 OP 缩小问题范围的问题的评论。
        • @Abizern,你是对的,但我怎样才能在格式正确的评论中写下整个答案?我已经阅读了很多其他答案,但仍然只包含一行暗示上述任何内容,人们也接受或支持它们。在这里,由于这个原因,我收到了反对票。
        • 在异步调用中移动后无法获得警报
        猜你喜欢
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多