2016-06-30 5 views
0

私はSwiftを学ぶスタックオーバーフローで新しく、今はAPI呼び出しのプロジェクトを作っています。私のプロジェクトでAPI呼び出しを使用しているときにカスタムアクティビティインジケータビューを使用する方法

APIからデータを取得するまで、カスタムアクティビティインジケータビューを使用したいと考えています。だから私のコードで問題を解消するのを手伝ってください。 私のプロジェクトにJTMaterialSpinnerライブラリをインポートしました。

これは私が見せたいスピナー(カスタムアクティビティインジケータ図)である。

enter image description here

これは私のコードです:私は、全体のコードに

import UIKit 
import Alamofire 
import SwiftyJSON 
import JTMaterialSpinner 

class ViewController: UIViewController ,UITextViewDelegate,UITableViewDataSource{ 
    var arrRes = [[String:AnyObject]]() 
    var spinerrview : JTMaterialSpinner = JTMaterialSpinner(frame: CGRectZero) 
    @IBOutlet weak var table: UITableView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     spinerrview.circleLayer.strokeColor = UIColor.redColor().CGColor 
     spinerrview.circleLayer.lineWidth=3.0 
     spinerrview.circleLayer 
     spinerrview.isAnimating=true 
     spinerrview.frame.size.height=25.0 
     spinerrview.frame.size.width = 25.0 
     spinerrview.center=table.center 
     spinerrview.beginRefreshing() 
     getdata(NSURL(string: "http:api.androidhive.info/contacts/")!, completionHandler: { (success) -> Void in 
      // When your API call was terminated, control flow goes here. 
      self.spinerrview.endRefreshing() 
      if success { 
       print("success") 
      } else { 
       print("fail") 
      } 
     }) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    typealias CompletionHandler = (success:Bool) -> Void 
    func getdata(url: NSURL,completionHandler: CompletionHandler) { 
     Alamofire.request(.GET, url).validate().responseJSON { response in 
      var flag = false // true if call is succeed,false otherwise 
      switch response.result { 
      case .Success(let data): 
       flag=true 
       let swiftyJsonVar = JSON(data) 
       if let resData = swiftyJsonVar["contacts"].arrayObject { 
        self.arrRes = resData as! [[String:AnyObject]] 
       } 
       self.table.reloadData() 
      case .Failure(let error): 
       flag=false 
       print("Request failed with error: \(error)") 
      } 
      completionHandler(success: flag) 
     } 
    } 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("jsonCell")!as! TableViewCell 
     var dict = arrRes[indexPath.row] 
     cell.name.text = dict["name"] as? String 
     return cell 
    } 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return arrRes.count 
    } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     performSegueWithIdentifier("gotoview", sender: self) 
    } 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if(segue.identifier == "gotoview") { 
      let indexPat = self.table.indexPathForSelectedRow! 
      let vc = segue.destinationViewController as! secondViewController 
      vc.adde = "add "+(arrRes[indexPat.row]["address"] as? String)! 
      vc.mail = "mail "+(arrRes[indexPat.row]["email"] as? String)! 
      vc.iid = "id "+(arrRes[indexPat.row]["id"] as? String)! 
      vc.nam = (arrRes[indexPat.row]["name"] as? String)! 
      vc.ph = "phone "+(arrRes[indexPat.row]["phone"]!["mobile"]as? String)! 
      } 
    } 
} 
を与える

var spinerrview : JTMaterialSpinner = JTMaterialSpinner(frame: CGRectZero) 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    spinerrview.circleLayer.strokeColor = UIColor.greenColor().CGColor spinerrview.circleLayer.lineWidth=2.0 
    spinerrview.frame.size.height=25.0 
    spinerrview.frame.size.width=25.0 
    spinerrview.circleLayer 
    spinerrview.isAnimating=true 
    spinerrview.backgroundColor=UIColor.greenColor() 
    spinerrview.beginRefreshing() 
    getdata() 
    spinerrview.endRefreshing() 
} 

ノウサギ

+0

スピナーで解決しましたか? –

+0

いいえ先生は解決しない –

+0

私は私の問題を解決してくれてありがとうございました –

答えて

0

あなたの問題は、これらの3つのラインでありますgetdataが呼び出された直後にスピナーが終了しました。あなたがライトボタンをすぐにオン/オフすると、それは実生活のようです。この種の問題を回避するために

、あなたの函()関数(API呼び出し)のためcompletionHandlerを作成することができます。

typealias CompletionHandler = (success:Bool) -> Void 
func getdata(url: NSURL,completionHandler: CompletionHandler) { 
    // API call code. 
    let flag = true // true if call is succeed,false otherwise 
    completionHandler(success: flag) 
} 

使用

spinerrview.beginRefreshing() 
getdata(NSURL(string: "http://...")!, { (success) -> Void in 
    // When your API call was terminated, control flow goes here. 
    spinerrview.endRefreshing() 
    if success { 
     // API call success 
    } else { 
     // API call fail 
    } 
}) 

更新: (getdata()を追加する新しい編集の後)

typealias CompletionHandler = (success:Bool) -> Void 

func getdata(url: NSURL,completionHandler: CompletionHandler) { 
    Alamofire.request(.GET, url).validate().responseJSON { response in 
     var flag = false // true if call is succeed,false otherwise 
     switch response.result { 
     case .Success(let data): 
      flag=true 
      let swiftyJsonVar = JSON(data) 
      if let resData = swiftyJsonVar["contacts"].arrayObject { 
       self.arrRes = resData as! [[String:AnyObject]] 
      } 
      self.table.reloadData() 
     case .Failure(let error): 
      flag=false 
      print("Request failed with error: \(error)") 
     } 
     completionHandler(success: flag) 
    } 
} 
+0

私はそれを行うが動作していない –

+0

あなたの質問の中にあなたのgetdata()メソッドを追加できますか? –

+0

これは私のgetメソッドです –

0

getData()関数で、クロージャパラメータを追加し、その内部にfinis hスピナーの動作。

spinerrview.beginRefreshing() 
getdata() 
spinerrview.endRefreshing() 

メインスレッドでスピナー開始は、函()が発足した、それは仕上がりだとき、あなたは知らないので、それはおそらくバックグラウンドスレッドでいくつかの作業を行います。

関連する問題