Ios 加载TableView时关闭UIAlertController
我编程了一个Ios 加载TableView时关闭UIAlertController,ios,iphone,swift,uitableview,uialertcontroller,Ios,Iphone,Swift,Uitableview,Uialertcontroller,我编程了一个UIAlertController作为加载屏幕 let waitActivityAlert = UIAlertController(title: nil, message: "Please wait...\n", preferredStyle: .alert) let spinner = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.whiteLarge) func lets
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
并没有拒绝我尝试的任何方法。这是我之前准备的一个。如果您只从一个地方进行调用,那么您不需要单独的函数,但是如果您认为可能需要再次调用它,您应该执行此操作-对于startActivityIndicator
func stopActivityIndicator()
{
DispatchQueue.main.async(execute: {
self.activityIndicator.stopAnimating()
})
}
这是我之前准备的。如果您只从一个地方进行调用,那么您不需要单独的函数,但是如果您认为可能需要再次调用它,您应该执行此操作-对于startActivityIndicator
func stopActivityIndicator()
{
DispatchQueue.main.async(execute: {
self.activityIndicator.stopAnimating()
})
}
是否从后台线程调用letstopspin()?您应该对主线程进行所有UI调用是的,我在TableView填充单元格之前使用的函数末尾调用LetsTopSpin()。如果您是从后台线程进行调用,则在后台线程完成之前不会调用它。您需要将其包装在发送到主队列的调度中,您能告诉我一个示例吗?我的主队列(viewDidLoad())调用函数,该函数在letsspin()方法之后启动tableView,因此在tableView中填充数据后,我的函数就完成了。我是编程界的新手,所以我不知道如何将LetsTopSpin()包装在其中。如果我在最后包装它,它根本就不会开始。看看我发布的答案-如果你在任何时候调用self.stopActivityIndicator(),该指示器应该立即停止。你是从后台线程调用letstopspin()吗?您应该对主线程进行所有UI调用是的,我在TableView填充单元格之前使用的函数末尾调用LetsTopSpin()。如果您是从后台线程进行调用,则在后台线程完成之前不会调用它。您需要将其包装在发送到主队列的调度中,您能告诉我一个示例吗?我的主队列(viewDidLoad())调用函数,该函数在letsspin()方法之后启动tableView,因此在tableView中填充数据后,我的函数就完成了。我是编程界的新手,所以我不知道如何将LetsTopSpin()包装在其中。如果我在最后包装它,它根本就不会开始。看一下我发布的答案-如果你在任何时候调用self.stopActivityIndicator(),指示器应该会立即停止。我添加了override func viewdidDisplay(uu-animated:Bool){super.viewdidDisplay(animated)self.letsstopspin()}
现在它被取消,但我仍然收到“演示或取消正在进行时尝试从视图控制器取消”警告。我忘记删除其他函数中的调用:D它现在可以正常工作,非常感谢!:-)很高兴为您提供帮助我添加了覆盖func viewdideappease(uuanimated:Bool){super.viewdideappease(animated)self.letsstopspin()}
,现在它被解除,但我仍然收到“在演示或解除过程中尝试解除视图控制器”警告。我忘记删除另一个函数中的调用:D它现在可以正常工作,非常感谢!:-)很乐意帮忙