2016-07-04 2 views
5

Pour une raison quelconque, la première fois que le contrôleur de vue est chargé, le contrôle d'actualisation se comporte comme prévu (s'affiche sous vue de la table lors de la lecture). Le problème est que lorsque j'appuie sur un autre onglet, puis que je reviens sur le contrôleur de vue, le contrôle de rafraîchissement ne s'estompe plus et est visible en haut de la vue de table.Actualiser le contrôle au-dessus de la vue de table lorsque je reviens voir le contrôleur

When I go back to view controller

Cela fait partie du code:

class CoreTableViewController : UIViewController, UITableViewDataSource, UITableViewDelegate { 

var tableView:UITableView! 
var tableData:Array<AnyObject> = [] 
var dataFetched:Bool = false 
var refreshControl:UIRefreshControl? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.edgesForExtendedLayout = UIRectEdge.None; 

    self.tableView = self.assignTableView() 
    self.tableView.delegate = self 
    self.tableView.dataSource = self 
    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell") 
    self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None; 

    if self.enableRefresher() { 
     self.setRefreshControl() 
    } 
} 

func enableRefresher() -> Bool { 
    return true 
} 

func fetchData(cleanFirst:Bool = false) { 
    // Fetch data. 
} 

func refresh() { 
    self.fetchData(true) 
    self.refreshControl!.endRefreshing() 
} 

func setRefreshControl() { 
    self.refreshControl = UIRefreshControl() 
    //self.refreshControl!.attributedTitle = NSAttributedString(string: "Actualizar") 
    self.refreshControl!.addTarget(self, action: #selector(CoreTableViewController.refresh), forControlEvents: UIControlEvents.ValueChanged) 
    self.tableView.addSubview(refreshControl!) 
} 

} 

Toute pensée?

+0

S'il vous plaît expliquer clairement, je ne comprends pas ce que vous voulez et ce que vous obtenez –

Répondre

0

Comme j'examine votre code et votre question, je pense que le problème est ici:

« En plus de l'attribution d'une commande de rafraîchissement à une propriété de vue tableau contrôleur refreshControl, vous devez configurer la cible et l'action du contrôle lui-même. " Donc, à partir de la documentation, vous devez utiliser UITableViewController et non UIViewController. Et définissez sa propriété refreshControl. Dans l'état actuel, il suffit d'ajouter UIRefreshControl en tant que sous-vue régulière.

+0

Que diriez-vous si vous souhaitez utiliser une vue de collection? J'ai exactement le même problème avec le contrôle d'actualisation dans une vue de collection. – Ricardo

+0

@ Ricardo, consultez la documentation de la collection. On dirait que UIRefreshControl est fait exclusivement pour UITableView. Peut-être que vous avez besoin de parcourir pour la solution déjà mise en œuvre ou faite par vous-même ... De toute façon c'est un sujet pour une question différente. –

0

Cela semble ok, je suppose que c'est parce que certaines conditions de concurrence concernant la création du contrôle lui-même. J'ai découvert que l'utilisation de propriétés paresseuses aide beaucoup dans ce cas. Je vais faire quelque chose comme ceci:

lazy var refreshControl: UIRefreshControl = { 
    let refreshControl = UIRefreshControl() 
    refreshControl.addTarget(self, action:#selector(CoreTableViewController.refresh(_:)), forControlEvents: .ValueChanged) 
    return refreshControl 
}() 

override public func viewDidLoad() { 
    super.viewDidLoad() 
    if self.enableRefresher() { 
     tableView.addSubview(refreshControl) 
    } 
    ........ 
} 

func refresh(refreshControl: UIRefreshControl) { 
    self.fetchData(true) 
    refreshControl.endRefreshing() 
} 

Vous n'avez pas besoin d'utiliser un TableViewController, un UIViewController est suffisant et le plus souvent plus souple.

Hope it helps

7

J'ai trouvé la solution ici: https://stackoverflow.com/a/29088409/209200

Au lieu de self.tableView.addSubview(refreshControl!), il devrait être self.tableView.insertSubview(refreshControl!, atIndex: 0).

Cela provoquait l'apparition du contrôle refres sur la tableview.

+0

Cela a fonctionné parfaitement pour moi merci! –

+1

même avec ceci, le refreshesControl est montré au-dessus de la table commençant l'ios 11.x (l'ios 9 fonctionne bien) –

3

Essayez ceci,

Les solutions ci-dessus sont bien, mais tableView.refreshControl est disponible pour UITableViewController seulement, jusqu'à ce que iOS 9.x et vient dans UITableView de iOS 10.x partir.

Pour résoudre ce problème il suffit d'utiliser:

Écrit à Swift 3 -

let refreshControl = UIRefreshControl() 
refreshControl.addTarget(self, action: #selector(FeedViewController.loadNewData), for: UIControlEvents.valueChanged) 
// Fix for the RefreshControl Not appearing in background 
tableView?.addSubview(refreshControl) 
tableView.sendSubview(toBack: refreshControl) 
0

Malheureusement, aucune solution m'a aidé ci-dessus.

Dans mon cas, un contrôle d'actualisation apparaît après le rechargement d'une vue de table lorsque la vue de table est vide. Peut-être que si la vue de la table a au moins une ligne, elle cache simplement le contrôle d'actualisation, je ne l'ai pas vérifié. En outre, lorsque mon contrôleur de vue apparaît à nouveau, il fonctionne comme une solution de contournement et il masque le contrôle d'actualisation.

Mais j'ai trouvé une autre solution de contournement pour masquer le contrôle d'actualisation immédiatement. Un appel async est obligatoire ici.J'ai été inspiré par this répondre dans un autre post.