【问题标题】:Dismiss a UIAlertController while Loading a TableView加载 TableView 时关闭 UIAlertController
【发布时间】:2017-01-18 13:55:17
【问题描述】:

我将UIAlertController 编程为加载屏幕

let waitActivityAlert = UIAlertController(title: nil, message: "Please wait...\n", preferredStyle: .alert)
let spinner = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.whiteLarge)

func letsspin(){

    spinner.translatesAutoresizingMaskIntoConstraints = false
    waitActivityAlert.view.addSubview(spinner)


    let xConstraint = NSLayoutConstraint(item: spinner, attribute: .centerX, relatedBy: .equal, toItem: waitActivityAlert.view, attribute: .centerX, multiplier: 1, constant: 0)

    let yConstraint = NSLayoutConstraint(item: spinner, attribute: .centerY, relatedBy: .equal, toItem: waitActivityAlert.view, attribute: .centerY, multiplier: 1.4, constant: 0)

    NSLayoutConstraint.activate([ xConstraint, yConstraint])

    spinner.isUserInteractionEnabled = false


    spinner.color = UIColor.black

    spinner.startAnimating()
    let height: NSLayoutConstraint = NSLayoutConstraint(item: waitActivityAlert.view, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)

    waitActivityAlert.view.addConstraints([height])

    present(waitActivityAlert, animated: true)


}

我正在后台加载一个 TableViewController。当我的UITableView 正在加载单元格时,我将使用以下函数关闭此UIAlertController

func letsstopspin(){

    spinner.stopAnimating()
    self.waitActivityAlert.dismiss(animated: true, completion: nil)

}

UIAlertController 没有关闭,我在控制台中收到此消息:

尝试在视图控制器中关闭 正在进行演示或解散

所以我不知道如何解决这个问题。在tableView() 方法之后有没有可以调用的方法? 我尝试了所有方法,但 UIAlertController 不会拒绝我尝试的任何方法。

【问题讨论】:

  • 你是从后台线程调用letsstopspin()吗?您应该对主线程进行所有 UI 调用
  • 是的,我在 TableView 填充单元格之前使用的函数末尾调用letsstopspin()
  • 如果您从后台线程进行调用,则在后台线程完成之前不会调用它。您需要将其包装在对主队列的调度中
  • 你能告诉我一个例子吗?我的主队列(viewDidLoad())在letspin()方法之后调用启动tableView的函数,所以在tableView充满数据后,我的函数完成了。我在编程世界中很新,所以我不知道如何将letsstopspin()包装在那里。如果我在最后包装它,它根本不会开始。
  • 看看我发布的答案 - 如果您在任何时候调用 self.stopActivityIndi​​cator(),指标应该立即停止。

标签: ios iphone swift uitableview uialertcontroller


【解决方案1】:

这是我之前准备的。如果您只从一个地方进行调用,那么您不需要单独的函数,但如果您认为您可能需要再次调用它,您应该这样做 - 类似 startActivityIndicator

func stopActivityIndicator()
{
    DispatchQueue.main.async(execute: {
        self.activityIndicator.stopAnimating()
    })
}

【讨论】:

  • 我添加了override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.letsstopspin() },现在它已被解除,但我仍然收到“在演示或解除正在进行时尝试从视图控制器解除”警告。
  • 我忘记删除其他函数中的调用 :D 现在可以正常工作了,非常感谢!
  • :-) 乐于助人
猜你喜欢
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 2014-08-24
  • 1970-01-01
  • 2016-09-07
相关资源
最近更新 更多