我有一个UITableView,最近我添加了一个刷新功能。

到目前为止,代码如下所示:

@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()

}


如您所见,我在刷新控制函数内调用函数fetchRequests(),同时也在其中设置attributedTitle以向用户显示上次更新。

我的函数fetchRequests()调用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()


fetchRecords中success情况下的内容不起作用。如何从那里引用refreshControl并在成功的情况下结束它?另外,目前我在fetchRecords的最后注释了这一行:

//self.tview.reloadData()


因为我相信/希望重装发生在dispatch_async内部-这是一个很好的假设吗?

最佳答案

您在这里做错的是您的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()
                        })
}


如果将输入的fetchRequests函数移动到函数内部,则func refresh(refreshControl:UIRefreshControl)也将起作用。

关于ios - 仅在完成数据获取时(在Swift中),如何隐藏UIRefreshControl?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36114088/

10-12 01:50