如何才能隐藏我的UIRefreshControl只提取数据完成(在Swift中)?

问题描述:

我有一个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服务和异步获取数据:

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当清爽的完成。

这条线:

self.refreshControl?.endRefreshing() 

success案件里面fetchRecords不起作用。如何从那里引用refreshControl并在成功的情况下结束它?另外,目前我注释掉线在fetchRecords的尽头:

//self.tview.reloadData() 

,因为我相信/希望重装发生内部dispatch_async地方 - 是很好的假设?

服务在后台线程上调用时,无法刷新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

你在做什么错在这里是你的refreshControl对象是本地,只有在viewDidLoad中可用,因此,即使您使用的是fetchRequest()将无法正常工作。将您的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刷新里面你进入fetchRequests FUNC(refreshControl:UIRefreshControl)也将正常工作。

+0

谢谢,但我只是在这里实现了两件事情 - 第一个:'self.tview.reloadData()'运行多次,因为它在循环中刷新记录的次数,每次记录刷新后所以我不能在这里刷新刷新,因为它会被调用xx次,我应该在循环完成后仅执行一次'endRefreshing' - 我该如何实现这一点? – randomuser1

+0

另一件事是我在本地创建了它因为在UITableViewController中已经有一个refreshControl了,我的类继承了它:'class UserList:UITableViewController {'所以我不知道如何使用该控制器的刷新控制器屁股... – randomuser1

+0

在for循环之外和之后移动调度块,看它是否工作。什么是SingleRequest在这里,它是另一个服务电话吗? –