Swift - 在打开下一个视图之前添加加载警报

时间:2017-03-27 11:11:40

标签: ios swift view load alert

我有一个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功能?

6 个答案:

答案 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)

首先,谢谢你们所有答案。关键是以其他方式思考,您不应该在第一个视图中显示警报并在第二个视图中关闭它。你应该:

  1. 转到第二个视图
  2. 打开警报加载(它不起作用,我改为使用UIActivityIndicatorView。添加故事板并创建变量)并开始加载所有数据。在我的情况下,我必须使用DispatchQueue.main.async来填充tableView,最后使用.reloadData()
  3. 何时加载,关闭警报加载。
  4. 特别感谢@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 
            }
    }