2016-03-20 5 views
0

私はUITableViewを持っていますが、最近はプル・リフレッシュ機能を追加しました。UIRefreshControlを非表示にするには、データの取得が完了したときのみ(Swiftで)?

は、これまでのコードは次のようになります。

@IBOutlet var tview: UITableView! 
var currentDate: NSDate = NSDate() 

override func viewDidLoad(){ 

    let refreshControl = UIRefreshControl() 

    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged) 
    refreshControl.attributedTitle = NSAttributedString(string: "last updated on \(currentDate)") 


    tview.separatorStyle = UITableViewCellSeparatorStyle.None 
    tview.addSubview(refreshControl) 
} 

func refresh(refreshControl: UIRefreshControl) { 

    refreshControl.attributedTitle = NSAttributedString(string: "last updated on \(currentDate)") 

    fetchRequests() 

} 

あなたはまた、私は、ユーザーの最後の時間を表示するためにそこにattributedTitleを設定するよ、私はリフレッシュ制御関数の内部機能​​を呼んでいる見ることができるようにアップデートのWebサービスを呼び出し、非同期データをフェッチ​​

My機能:

func fetchRequests(){ 
    Alamofire.request(.GET, "https://mywebservice", parameters: ["username": username]) 
     .responseJSON { response in 
      switch response.result { 
      case .Success: 

       self.items.removeAllObjects() 
       if let jsonData = response.result.value as? [[String: AnyObject]] { 
        for requestJSON in jsonData { 
         if let request = SingleRequest.fromJSON(JSON(requestJSON)){ 
          self.items.addObject(request) 
          dispatch_async(dispatch_get_main_queue(),{ 
           self.tview.reloadData() 
           self.refreshControl?.endRefreshing() 
           self.currentDate = NSDate() 
          }) 

         } 
        } 
       } 
       //self.tview.reloadData() 

      case .Failure(let error): 
       print("SWITCH ERROR") 
       print(error) 
      } 

    } 
} 

と私はリフレッシュが行われたときにrefreshControlを非表示にします。

この行:fetchRecordsでsuccess

self.refreshControl?.endRefreshing() 

内部は動作しません。成功した場合、どうすればそこからrefreshControlを参照して終了できますか?また、現在、私はfetchRecordsの最後に行をコメントアウト:リロードがdispatch_async内部で行われることを願っています

//self.tview.reloadData() 

私は/信じているから - それは良い仮定がありますか?

答えて

0

サービスがバックグラウンドスレッドで呼び出している間に、UIを更新できません。応答が得られたら、dispatch_get_main_queueの中で解析し、Userintefaceを変更します。

func fetchRequests(){ 
    Alamofire.request(.GET, "https://mywebservice", parameters: ["username": username]) 
     .responseJSON { response in 
dispatch_async(dispatch_get_main_queue(),{ 
      switch response.result { 
      case .Success: 

       self.items.removeAllObjects() 
       if let jsonData = response.result.value as? [[String: AnyObject]] { 
        for requestJSON in jsonData { 
         if let request = SingleRequest.fromJSON(JSON(requestJSON)){ 
          self.items.addObject(request) 

           self.tview.reloadData() 
           self.refreshControl?.endRefreshing() 
           self.currentDate = NSDate() 


         } 
        } 
       } 
       //self.tview.reloadData() 

      case .Failure(let error): 
       print("SWITCH ERROR") 
       print(error) 
      } 

    } 
}) 
} 
+0

ですが、 'dispatch_async(dispatch_get_main_queue()、{'?)の中で 'self.refreshControl?.endRefreshing()'を呼び出すときに今行っていることではありませんので、残念ながらうまくいきません。 .. – randomuser1

0

は、何が間違ってここにやっていることはあなたのrefreshControlオブジェクトはローカルであり、あなたはそれが動作しません)(fetchRequestで使用しているので、場合でも、唯一のviewDidLoadで利用可能です。 refreshControlオブジェクトをfetchRequests関数に渡します。事の下に試してみてください。

func refresh(refreshControl: UIRefreshControl) { 
refreshControl.attributedTitle = NSAttributedString(string: "last updated on \(currentDate)") 
fetchRequests(refreshControl) 
} 

func fetchRequest(refreshControl: UIRefreshControl) { 
    //existing code.... 
    dispatch_async(dispatch_get_main_queue(),{ 
          self.tview.reloadData() 
          refreshControl?.endRefreshing() 
          self.currentDate = NSDate() 
         }) 
} 

あなたはFUNCリフレッシュ(refreshControl:UIRefreshControl)中にあなたfetchRequestsを入力funcが移動する場合も動作します。

+0

ありがとう、私はちょうどここで2つのことを実現しました - 最初のもの: 'self.tview.reloadData()'は、ループ内にあり、各レコードがリフレッシュした後にフェッチされたレコードが何回もリフレッシュされるので、テーブルビューなので、ここでリフレッシャーをリフレッシュすることはできません。xx回呼び出されるので、ループが終了してからendRefreshingを1回実行する必要があります。どうすれば実現できますか? – randomuser1

+0

もう1つは、 UITableViewControllerに既にrefreshControlがあり、クラスが継承しているので、 'class UserList:UITableViewController {'だから、そのclからリフレッシュコントローラを使う方法がわかりませんでしたお尻... – randomuser1

+0

ディスパッチブロックをforループの外側と後ろに移動して、動作しているかどうかを確認します。 SingleRequestとは何ですか?それは別のサービスコールですか? –