Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在api调用Swift上显示活动指示器_Ios_Swift_Xcode_Swift3 - Fatal编程技术网

Ios 在api调用Swift上显示活动指示器

Ios 在api调用Swift上显示活动指示器,ios,swift,xcode,swift3,Ios,Swift,Xcode,Swift3,我想在执行api调用时显示一个活动指示器。当收到api响应时,活动指示器应停止 但api调用期间未显示活动指示器。我是swift新手,这是我的代码 import UIKit var ARR_states : NSArray = NSArray() var activityIndicatorView: UIActivityIndicatorView = UIActivityIndicatorView() var VW_overlay: UIView = UIView() class VC_se

我想在执行api调用时显示一个活动指示器。当收到api响应时,活动指示器应停止

但api调用期间未显示活动指示器。我是swift新手,这是我的代码

import UIKit

var ARR_states : NSArray = NSArray()
var activityIndicatorView: UIActivityIndicatorView = UIActivityIndicatorView()
var VW_overlay: UIView = UIView()

class VC_search_Course: UIViewController {

@IBOutlet weak var TBL_states :UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    VW_overlay = UIView(frame: UIScreen.main.bounds)
    VW_overlay.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)

    activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
    activityIndicatorView.frame = CGRect(x: 0, y: 0, width: activityIndicatorView.bounds.size.width, height: activityIndicatorView.bounds.size.height)

    activityIndicatorView.center = VW_overlay.center
    VW_overlay.addSubview(activityIndicatorView)
    VW_overlay.center = view.center
    view.addSubview(VW_overlay)

    activityIndicatorView.startAnimating()
    perform(#selector(self.Places_API), with: activityIndicatorView, afterDelay: 0.01)

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}



@IBAction func button_back(sender: UIButton) {
    self.dismiss(animated: false, completion: nil)
}

func Places_API()
{
    let STR_url = String(format: "%@/search_by_location", SERVER_URL)
    let auth_tok = String(format:"%@",UserDefaults.standard.value(forKey:"auth_token") as! CVarArg)
       if let url = NSURL(string:STR_url) {
        let request = NSMutableURLRequest(url: url as URL)
        request.httpMethod = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.addValue(auth_tok, forHTTPHeaderField: "auth_token")

        let task = URLSession.shared.dataTask(with: request as URLRequest) {
            data, response, error in
            if error != nil {
                print("\(String(describing: error))")
                return
            }

            let temp_dictin: [AnyHashable: Any]? = ((try? JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [AnyHashable: Any])


            ARR_states = temp_dictin?["course_locations"] as! NSArray
            NSLog("States response %@", ARR_states)

        }
        task.resume()
    }

    activityIndicatorView.stopAnimating()
    VW_overlay.isHidden = true
}
}

上述代码未显示活动指示器,我尝试更改视图背景颜色。和活动指示器颜色,但在响应处理程序中不使用

,停止活动指示器

func Places_API() {
activityIndicatorView.stopAnimating()
//Handle response here
}

Swift 3.0

为此,我只实现了如下两个函数。希望这也能对你有所帮助

 func showLoader(view: UIView) -> UIActivityIndicatorView {

        //Customize as per your need
        let spinner = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 40, height:40))
        spinner.backgroundColor = UIColor.black.withAlphaComponent(0.7)
        spinner.layer.cornerRadius = 3.0
        spinner.clipsToBounds = true
        spinner.hidesWhenStopped = true
        spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.white;
        spinner.center = view.center
        view.addSubview(spinner)
        spinner.startAnimating()
        UIApplication.shared.beginIgnoringInteractionEvents()

        return spinner
    }
对于隐藏活动指示器

extension UIActivityIndicatorView {  
     func dismissLoader() {
            self.stopAnimating()
            UIApplication.shared.endIgnoringInteractionEvents()
        } 
 }
以及
UIViewController
,您在其中使用的指示器如下所示

    //Show
    let spinner = showLoader(view: self.view)

    //Hide
    spinner.dismissLoader()
从中删除您的代码

task.resume()
}

// activityIndicatorView.stopAnimating()
// VW_overlay.isHidden = true
并在下面的位置将代码添加到块调用中

 let task = URLSession.shared.dataTask(with: request as URLRequest) {
        data, response, error in

       // call here 
       activityIndicatorView.stopAnimating()
        VW_overlay.isHidden = true


        if error != nil {
            print("\(String(describing: error))")
            return
        }
       ......

那么问题出在哪里呢?在这里,您只需要开始设置动画的代码。一旦你得到回复,只需调用StopAnimaging问题是什么?当我尝试调用api时,这里需要进一步详细说明VW_覆盖和活动指示器视图不显示在屏幕@mding5692上,不显示活动指示器视图是否显示VW_覆盖?我的问题是活动指示器不显示您确定正在显示它吗主线程和添加VW_覆盖层是在您尝试显示活动指示器之前完成的?为什么。VW_overlay.removeFromSuperview()如果我需要调用另一个api,我必须再次添加VW_overlay,对吗?活动在收到Json数据5-10秒后停止任何在我收到响应时立即停止的解决方案都将在main_sync中调用停止动画,