iOS:tableView.reloadData()不';我不能在斯威夫特工作
我试图在Swift中更新数据后重新加载我的表视图,但它似乎不起作用。当我更改选项卡并返回时,会重新加载表视图,但不会自动加载。 这是我的密码:iOS:tableView.reloadData()不';我不能在斯威夫特工作,ios,uitableview,swift,reloaddata,Ios,Uitableview,Swift,Reloaddata,我试图在Swift中更新数据后重新加载我的表视图,但它似乎不起作用。当我更改选项卡并返回时,会重新加载表视图,但不会自动加载。 这是我的密码: override func viewDidLoad() { super.viewDidLoad() // some code refresh(self) } func refresh(sender: AnyObject) { // Reload the data self.tableView.reloadD
override func viewDidLoad() {
super.viewDidLoad()
// some code
refresh(self)
}
func refresh(sender: AnyObject) {
// Reload the data
self.tableView.reloadData()
}
我不明白为什么它在Objective-C中有效,但在Swift中无效。。。
我还试图提出:
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
})
因为我在其他帖子中看到了这一点,但它也不起作用
谢谢你的帮助
编辑:我的整个视图控制器
class HighwaysViewController: UITableViewController {
var highways: [Highway]!
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
highways = [Highway]()
// On ajoute le "Pull to refresh"
refreshControl = UIRefreshControl()
refreshControl!.addTarget(self, action: Selector("refresh:"), forControlEvents: UIControlEvents.ValueChanged)
tableView.addSubview(refreshControl!)
refresh(self)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func refresh(sender: AnyObject) {
// Afficher l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
// On télécharge les autoroutes
var url = NSURL(string: "http://theurl.com")! // URL du JSON
var request = NSURLRequest(URL: url) // Création de la requête HTTP
var queue = NSOperationQueue() // Création de NSOperationQueue à laquelle le bloc du gestionnaire est distribué lorsque la demande complète ou échoué
// Envoi de la requête asynchrone en utilisant NSURLConnection
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{(response: NSURLResponse!, data: NSData!, error: NSError!) ->Void in
// Gestion des erreurs de connexion
if error != nil {
// Masquer l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
println(error.localizedDescription)
let errorAlert = UIAlertView(title: "Erreur", message: error.localizedDescription, delegate: self, cancelButtonTitle: "OK")
errorAlert.show()
}
else {
// Récupération du JSON et gestion des erreurs
let json = JSON(data: data)
if let highwaysData = json.arrayValue {
for highway in highwaysData {
var newHighway = Highway(ids: highway["Ids"].stringValue, name: highway["Name"].stringValue, label: highway["Direction"].stringValue, length: highway["Length"].stringValue, directions: highway["Direction"].stringValue, operateur: highway["Operator"].stringValue)
self.highways.append(newHighway)
}
}
}
})
if (self.refreshControl!.refreshing) {
self.refreshControl!.endRefreshing()
}
tableView.reloadData() // Here is the problem
// Masquer l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// Return the number of rows in the section.
return highways.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("highwayCell", forIndexPath: indexPath) as UITableViewCell
// Configure the cell...
let tableCell = highways[indexPath.row]
let nameLabel = cell.viewWithTag(1) as UILabel
let directionLabel = cell.viewWithTag(2) as UILabel
nameLabel.text = tableCell.name!
directionLabel.text = tableCell.getDirections()
return cell
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
}
在
refresh
函数中,加载使用闭包异步完成,但您正在更新活动指示器并在闭包外部重新加载表,因此它将在加载完成之前执行。您需要将此代码移动到闭包中,并确保它在主队列上执行(因为它更新了UI)
如果您正在使用一个选项卡栏控制器(听起来像是这样),并且在修改另一个选项卡中的内容后希望刷新表,则需要从目标视图控制器的ViewWillAspect()或ViewDidAspect()方法内部调用tableView.reloadData()。viewDidLoad()在该视图控制器的生命周期内只调用一次。是否仅从
viewDidLoad
调用refresh()
?请注意,它在每个视图控制器生命周期中只执行一次。除了viewDidLoad之外,您在哪里调用reloadData?此外,不需要在刷新中传递对self的引用method@Kirsteins不,当分配刷新控件的用户“Pull to refresh”时,我也调用refresh()
,如何将其放入tableView中?请在您的问题中显示所有相关代码,而不是让我们在评论中一行一行地梳理出来。不,我希望在同一个选项卡中刷新。我只想在加载数据后刷新表视图,但不需要查看更多视图控制器代码。“加载数据”可以用很多不同的方法来完成。非常感谢,它工作得非常完美,现在我更好地理解了我的错误:)PS:在闭包中,我们必须使用self
调用变量:self.tableView.reloadData()
我已经更新了答案。我只是复制了你的代码,所以我错过了。就我个人而言,我总是使用self
来避免混淆,这也是Obj C的一个习惯,因为它总是需要的。
func refresh(sender: AnyObject) {
// Afficher l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
// On télécharge les autoroutes
var url = NSURL(string: "http://theurl.com")! // URL du JSON
var request = NSURLRequest(URL: url) // Création de la requête HTTP
var queue = NSOperationQueue() // Création de NSOperationQueue à laquelle le bloc du gestionnaire est distribué lorsque la demande complète ou échoué
// Envoi de la requête asynchrone en utilisant NSURLConnection
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{(response: NSURLResponse!, data: NSData!, error: NSError!) ->Void in
// Gestion des erreurs de connexion
if error != nil {
// Masquer l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
println(error.localizedDescription)
let errorAlert = UIAlertView(title: "Erreur", message: error.localizedDescription, delegate: self, cancelButtonTitle: "OK")
errorAlert.show()
}
else {
// Récupération du JSON et gestion des erreurs
let json = JSON(data: data)
if let highwaysData = json.arrayValue {
for highway in highwaysData {
var newHighway = Highway(ids: highway["Ids"].stringValue, name: highway["Name"].stringValue, label: highway["Direction"].stringValue, length: highway["Length"].stringValue, directions: highway["Direction"].stringValue, operateur: highway["Operator"].stringValue)
self.highways.append(newHighway)
}
}
}
dispatch_async(dispatch_get_main_queue(), {
if (self.refreshControl!.refreshing) {
self.refreshControl!.endRefreshing()
}
self.tableView.reloadData()
// Masquer l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
})
})
}