我有一个View Controller需要花时间加载,因此,当我点击按钮或链接转到该视图时,我想显示一条警告消息,供用户等待,因为视图正在加载。
我是怎么做到的?我无法从另一个视图关闭警报。
这是我的代码:
class ViewControllerDetalleCliente:
@IBAction func verCrearPedido(_ sender: Any) {
let alert = UIAlertController(title: nil, message: "Cargando...", preferredStyle: .alert)
alert.view.tintColor = UIColor.black
let loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50)) as UIActivityIndicatorView
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
loadingIndicator.startAnimating();
alert.view.addSubview(loadingIndicator)
present(alert, animated: true, completion: nil)
let next:ViewControllerPedidoArticulos = storyboard?.instantiateViewController(withIdentifier: "PedidoArticulos") as! ViewControllerPedidoArticulos
next.nuevoPedido = true
self.navigationController?.pushViewController(next, animated: true)
}
class ViewControllerPedidoArticulos:
func viewDidLoad() {
super.viewDidLoad()
self.dismiss(animated: true, completion: nil)
}
我必须在何处或如何使用.dismiss
功能?
答案 0 :(得分:1)
如果您想在ActivityIndicator
中显示ViewControllerPedidoArticulos
,则需要将ActivityIndicator
放在该控制器内。当您获得响应时,显示带有指示符的AlertController
,其中您将获得任何异步请求。
首先从按钮操作中删除ActivityIndicator
代码。
@IBAction func verCrearPedido(_ sender: Any) {
let next = storyboard?.instantiateViewController(withIdentifier: "PedidoArticulos") as! ViewControllerPedidoArticulos
next.nuevoPedido = true
self.navigationController?.pushViewController(next, animated: true)
}
在ViewControllerPedidoArticulos
控制器内部之后,在您发出任何异步请求之前添加该代码,或者如果您在viewDidLoad
中发出请求,则可以在viewDidLoad
内添加该代码。
override func viewDidLoad() {
super.viewDidLoad()
//Show the indicator with alertController
let alert = UIAlertController(title: nil, message: "Cargando...", preferredStyle: .alert)
alert.view.tintColor = UIColor.black
let loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50)) as UIActivityIndicatorView
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
loadingIndicator.startAnimating();
alert.view.addSubview(loadingIndicator)
present(alert, animated: true, completion: nil)
}
现在只需调用您获得异步请求响应的dismiss
。
self.dismiss(animated: true)
答案 1 :(得分:1)
我认为你应该将UIAlertController
对象传递给下一个视图控制器,如下所示:
let next:ViewControllerPedidoArticulos = storyboard?.instantiateViewController(withIdentifier: "PedidoArticulos") as! ViewControllerPedidoArticulos
next.nuevoPedido = true
next.objAlert = alert
self.navigationController?.pushViewController(next, animated: true)
在你的下一个视图中,控制器的viewDidLoad
忽略了警告,如:
func viewDidLoad(_ animated: Bool) {
super.viewDidAppear(animated)
if let alert = objAlert as! UIAlertController{
alert.dismiss(animated: true, completion: nil)
}
}
答案 2 :(得分:1)
有几种方法可以做到这一点,但我正在使用闭包编写最简单的方法。
第1步:在ViewControllerPedidoArticulos'中进行关闭班级
let stopActivityBlock : (()->())?
第2步:设置其回拨代码
next.stopActivityBlock = { () in
self.dismiss(animated: true, completion: nil)
}
第3步:
来自' ViewControllerPedidoArticulos' class的viewDidLoad方法。
class ViewControllerPedidoArticulos:
func viewDidLoad() {
super.viewDidLoad()
if stopActivityBlock != nil{
stopActivityBlock()
}
}
答案 3 :(得分:0)
您必须将警报视图控制器交给第二个视图控制器,并在那里将其关闭。类似的东西:
@IBAction func verCrearPedido(_ sender: Any) {
// ...
next.alertVC = alert
// push
}
class ViewControllerPedidoArticulos:
var alertVC:UIAlertController?
// viewDidLoad or maybe better:
func viewDidLoad(_ animated: Bool) {
super.viewDidAppear(animated)
self.alertVC?.dismiss(animated: true, completion: nil)
}
答案 4 :(得分:0)
您可以使用第三方pod库“SVProgressHUD”,我通常在从API加载一些数据时使用它来向用户执行加载视图。
只需将pod安装在你的podfile中,然后使用
导入你的课程import SVProgressHUD
之后,只需使用以下代码即可在应用程序在后台运行时使用加载指示器。
//Loading progress ui until the data is retrieved from the server
SVProgressHUD.show(withStatus: "Loading...")
//After completing the retrieval of data from server
SVProgressHUD.dismiss()
非常简单,看起来很棒。唯一的先决条件是您应该知道如何安装pods / cocoapods
我希望它有所帮助。欢呼声。
答案 5 :(得分:0)
首先,谢谢你们所有答案。关键是以其他方式思考,您不应该在第一个视图中显示警报并在第二个视图中关闭它。你应该:
UIActivityIndicatorView
。添加故事板并创建变量)并开始加载所有数据。在我的情况下,我必须使用DispatchQueue.main.async
来填充tableView,最后使用.reloadData()
特别感谢@NiravD这个想法。
我的代码:
@IBOutlet var cargando: UIActivityIndicatorView!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.tableView.reloadData()
cargando.stopAnimating()
cargando.isHidden = true
}
override func viewDidLoad() {
super.viewDidLoad()
cargando.startAnimating()
DispatchQueue.main.async {
... // load data
}
}