2016-07-04 13 views
5

Per qualche motivo, la prima volta che viene caricato il controller di visualizzazione, il controllo di aggiornamento si comporta come previsto (che, mostrato sotto tableview quando scorri verso il basso). Il problema è quando tocchi un'altra scheda, e poi torno al controller della vista, il controllo di aggiornamento non svanisce più ed è visibile in cima al tableview.Refresh Control in cima a tableview quando torno indietro per vedere il controller

When I go back to view controller

Questo fa parte del codice:

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!) 
} 

} 

Qualche idea?

+0

Prego elaborarlo chiaramente, non capisco cosa vuoi e cosa ottieni –

risposta

0

Come esamino il codice e la tua domanda, penso che il problema è qui:

"Oltre ad assegnare un controllo di aggiornamento alla proprietà refreshControl una vista del controller tabella, è necessario configurare il bersaglio e l'azione del controllo si." https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIRefreshControl_class/index.html#//apple_ref/occ/instm/UIRefreshControl/endRefreshing

Quindi, dalla documentazione, è necessario utilizzare UITableViewController, non UIViewController. E imposta la proprietà refreshControl.

Nello stato corrente, è sufficiente aggiungere UIRefreshControl come subview regolare.

+0

Che dire se si desidera utilizzare una vista insieme? Ho esattamente lo stesso problema con il controllo di aggiornamento all'interno di una vista di raccolta. – Ricardo

+0

@Ricardo, controlla la documentazione della collezione. Sembra che UIRefreshControl sia realizzato esclusivamente per UITableView. Forse hai bisogno di cercare soluzioni già implementate o fatte da te ... Comunque è un argomento per domande diverse. –

0

Sembra ok, ho il sospetto che sia dovuto ad alcune condizioni di competizione relative alla creazione del controllo stesso. Ho scoperto che l'utilizzo di proprietà lazy aiuta molto in questi casi. Farò qualcosa di simile:

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

Non è necessario utilizzare un TableViewController, un UIViewController è sufficiente e il più delle volte più flessibile.

Speranza che aiuta

7

ho trovato la soluzione qui: https://stackoverflow.com/a/29088409/209200

Invece di self.tableView.addSubview(refreshControl!), dovrebbe essere self.tableView.insertSubview(refreshControl!, atIndex: 0).

Ciò causava la visualizzazione del controllo refres sulla vista tabella.

+0

Questo ha funzionato perfettamente per me grazie! –

+1

anche con questo, il refreshesControl viene mostrato sopra la tabella a partire da ios 11.x (ios 9 funziona bene) –

3

Prova questo,

Le soluzioni di cui sopra sono belle ma tableView.refreshControl è disponibile per UITableViewController solo, fino a iOS 9.x ed è disponibile in UITableView da iOS 10.x in poi.

Per correggere questo Basta utilizzare:

Scritto in 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

Purtroppo, nessuno soluzione di cui sopra mi ha aiutato.

Nel mio caso, un controllo di aggiornamento viene visualizzato dopo aver ricaricato una vista tabella quando la vista tabella è vuota. Forse se la vista tabella ha almeno una riga nasconde semplicemente il controllo di aggiornamento, non l'ho verificato. Inoltre, quando il mio controller di visualizzazione appare di nuovo, funziona come una soluzione alternativa e nasconde il controllo di aggiornamento.

Ma ho trovato un'altra soluzione per nascondere immediatamente il controllo di aggiornamento. Una chiamata async è obbligatoria qui.

tableView.reloadData() 
DispatchQueue.main.async { 
    refreshControl.endRefreshing() 
} 

Sono stato ispirato dalla risposta this in un altro post.

Problemi correlati