Ios 在api调用Swift上显示活动指示器
我想在执行api调用时显示一个活动指示器。当收到api响应时,活动指示器应停止 但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
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中调用停止动画,