Swift - 在打开下一个视图之前添加加载提醒

Swift - Add an loading alert before open next view

我有一个需要时间加载的视图控制器,因此,当我单击一个按钮或 link 转到该视图时,我想显示一条警告消息让用户等待,因为正在加载视图。

我该怎么做?我无法从另一个视图关闭警报。

这是我的代码:

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 函数?

您必须将警报视图控制器交给第二个视图控制器,然后在那里关闭它。类似于:

@IBAction func verCrearPedido(_ sender: Any) {
    // ...
    next.alertVC = alert
    // push
}

class ViewController 小儿科文章:

var alertVC:UIAlertController?

// viewDidLoad or maybe better:
func viewDidLoad(_ animated: Bool) {
    super.viewDidAppear(animated)        
    self.alertVC?.dismiss(animated: true, completion: nil)
}

您可以使用第三方 pod 库 "SVProgressHUD",我通常在从 API 加载一些数据时使用它来向用户执行加载视图。

只需在您的 podfile 中安装 pod,然后使用

导入您的 class
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

希望对您有所帮助。干杯。

如果您想在 ViewControllerPedidoArticulos 中显示 ActivityIndicator,则需要将 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)

我认为你应该像这样将 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)
   }
}

有几种方法可以做到这一点,但我正在使用闭包编写最简单的方法。

第 1 步:在 'ViewControllerPedidoArticulos' class

中关闭
 let stopActivityBlock : (()->())?

第二步:设置其回调码

next.stopActivityBlock = { () in
self.dismiss(animated: true, completion: nil)
}

第 3 步:

从 'ViewControllerPedidoArticulos' class 的 viewDidLoad 方法中调用它。

class ViewControllerPedidoArticulos:

func viewDidLoad() {
    super.viewDidLoad()        
    if stopActivityBlock != nil{
    stopActivityBlock()
}
}

首先感谢大家的回答。关键是换一种方式思考,你不应该在第一个视图中显示警报并在第二个视图中关闭它。你应该:

  1. 转到第二个视图
  2. 打开警报加载(它不起作用,我改用UIActivityIndicatorView。用故事板添加它并创建变量)并开始加载所有数据。在我的例子中,我必须使用 DispatchQueue.main.async 来填充 tableView,最后 .reloadData()
  3. 加载完成后,关闭提醒加载。

特别感谢 的想法。

我的代码:

@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 
        }
}