如何才能隐藏我的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)
}
}
})
}
你在做什么错在这里是你的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)也将正常工作。
谢谢,但我只是在这里实现了两件事情 - 第一个:'self.tview.reloadData()'运行多次,因为它在循环中刷新记录的次数,每次记录刷新后所以我不能在这里刷新刷新,因为它会被调用xx次,我应该在循环完成后仅执行一次'endRefreshing' - 我该如何实现这一点? – randomuser1
另一件事是我在本地创建了它因为在UITableViewController中已经有一个refreshControl了,我的类继承了它:'class UserList:UITableViewController {'所以我不知道如何使用该控制器的刷新控制器屁股... – randomuser1
在for循环之外和之后移动调度块,看它是否工作。什么是SingleRequest在这里,它是另一个服务电话吗? –
但不是我现在在调用dispatch_async(dispatch_get_main_queue(),{??]里面的'self.refreshControl?.endRefreshing()'时所做的,因为如果是这样,那么它不起作用。 .. – randomuser1