2016-07-04 3 views
5

Aus irgendeinem Grunde das erste Mal des View-Controller geladen wird, verhält sich die Refresh-Steuer wie erwartet (das es zeigt unter Tableview, wenn Swipe nach unten). Das Problem ist, wenn ich auf eine andere Registerkarte tippe und dann zurück zum View-Controller gehe, wird das Refresh-Steuerelement nicht mehr eingeblendet und ist über der Tabellenansicht sichtbar.Refresh Kontrolle auf der Tableview, wenn ich zu View-Controller zurück

When I go back to view controller

Dieser Teil des Codes ist:

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

} 

Irgendwelche Gedanken?

+0

Bitte erläutern Sie es deutlich, ich verstehe nicht, was Sie wollen und was Sie bekommen –

Antwort

0

Wie ich Ihren Code und Ihre Frage untersuchen, ich denke, das Problem hier ist:

„Zusätzlich refreshControl Eigenschaft eine Auffrisch-Steuer zu einer Tabellenansicht Controllers zu zuweisen kann, müssen Sie das Ziel und die Wirkung der Steuer konfigurieren selbst." https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIRefreshControl_class/index.html#//apple_ref/occ/instm/UIRefreshControl/endRefreshing

Also, von Dokumentation benötigen Sie UITableViewController, nicht UIViewController zu verwenden. Und legen Sie seine refreshControl -Eigenschaft fest.

Im aktuellen Stand, die Sie gerade UIRefreshControl als reguläre Subview hinzuzufügen.

+0

Was ist, wenn Sie eine Sammlung Ansicht verwenden möchten? Ich habe genau das gleiche Problem mit dem Refresh-Steuerelement in einer Sammlungsansicht. – Ricardo

+0

@Ricardo, sehen Sie sich die Dokumentation zur Sammlung an. Sieht so aus, als ob UIRefreshControl ausschließlich für UITableView erstellt wurde. Vielleicht müssen Sie nach der bereits implementierten Lösung suchen oder sie selbst machen ... Wie auch immer, es ist ein Thema für andere Fragen. –

0

Es sieht ok, ich vermute, es ist, weil einige Race-Bedingung die Schaffung der Kontrolle über sich selbst. Ich fand heraus, dass die Verwendung von faulen Eigenschaften in diesen Fällen sehr hilfreich ist. Ich werde etwas tun:

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

Sie brauchen keine Tableviewcontroller zu verwenden, ist ein UIViewController genug und mehr als oft nicht flexibler.

Hoffe, dass es

7

hilft fand ich das Update hier: https://stackoverflow.com/a/29088409/209200

Statt self.tableView.addSubview(refreshControl!), es self.tableView.insertSubview(refreshControl!, atIndex: 0) sein sollte.

Das führte dazu, dass die Refresh-Kontrolle über der Tabellenansicht erschien.

+0

Das hat perfekt für mich funktioniert, danke! –

+1

sogar mit diesem wird das RefreshesControl über der Tabelle beginnend mit ios 11.x angezeigt (ios 9 funktioniert gut) –

3

Try this,

die oben genannten Lösungen sind in Ordnung, aber tableView.refreshControl für UITableViewController nur verfügbar ist, bis iOS 9.x und kommt in UITableView von iOS 10.x ab.

diese verwenden zu beheben einfach:

Geschrieben 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

Leider keine Lösung über mir geholfen hat.

In meinem Fall eine Auffrischungssteuer erscheint, nachdem eine Tabellenansicht neu geladen, wenn die Tabellenansicht leer. Wenn die Tabellenansicht mindestens eine Zeile enthält, wird das Aktualisierungssteuerelement einfach ausgeblendet, ich habe es nicht überprüft. Wenn mein View-Controller erneut angezeigt wird, funktioniert er wie eine Problemumgehung und verbirgt das Aktualisierungssteuerelement.

Aber ich habe eine andere Abhilfe findet sofort die Refresh-Steuerung zu verbergen. Ein async Anruf ist hier obligatorisch.

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

Ich wurde von this Antwort in einem anderen Beitrag inspiriert.

Verwandte Themen