Ich habe ein UIRefreshControl in meinem UITableViewController eingerichtet (der sich in einem UINavigationController befindet) und es funktioniert wie erwartet (dh Pulldown löst das richtige Ereignis aus). Wenn ich jedoch die beginRefreshing
Instanzmethode auf dem Aktualisierungssteuerelement programmgesteuert aufrufe, wie folgt:
[self.refreshControl beginRefreshing];
Nichts passiert. Es sollte animiert werden und den Spinner zeigen. Die endRefreshing
Methode funktioniert einwandfrei, wenn ich das nach der Aktualisierung aufrufe.
Ich habe ein grundlegendes Prototypprojekt mit diesem Verhalten erstellt und es funktioniert ordnungsgemäß, wenn mein UITableViewController direkt zum Root-View-Controller des Anwendungsdelegierten hinzugefügt wird, z.
self.viewController = tableViewController;
self.window.rootViewController = self.viewController;
Wenn ich das tableViewController
aber zuerst einem UINavigationController hinzufüge und dann den Navigationscontroller als das hinzufüge rootViewController
, beginRefreshing
funktioniert die Methode nicht mehr. Z.B
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableViewController];
self.viewController = navController;
self.window.rootViewController = self.viewController;
Ich habe das Gefühl, dass dies etwas mit den verschachtelten Ansichtshierarchien innerhalb des Navigationscontrollers zu tun hat, die mit der Auffrischungssteuerung nicht gut funktionieren - irgendwelche Vorschläge?
Vielen Dank
UITableViewController hat nach iOS 7 automatisch die Eigenschaft AdjustsScrollViewInsets . Die Tabellenansicht verfügt möglicherweise bereits über contentOffset, normalerweise (0, -64).
Der richtige Weg, um refreshControl anzuzeigen, nachdem Sie programmgesteuert mit dem Aktualisieren begonnen haben, besteht darin, die Höhe von refreshControl zu vorhandenem contentOffset hinzuzufügen.
quelle
-64
ist besser zu bedienen-self.topLayoutGuide.length
Hier ist eine Swift-Erweiterung mit den oben beschriebenen Strategien.
quelle
sendActionsForControlEvents(UIControlEvents.ValueChanged)
am Ende dieser Funktion zu setzen, da sonst die eigentliche Logik der Aktualisierungslogik nicht ausgeführt wird.Keine der anderen Antworten hat bei mir funktioniert. Sie würden den Spinner dazu bringen, sich zu zeigen und zu drehen, aber die Auffrischungsaktion selbst würde niemals stattfinden. Das funktioniert:
Beachten Sie, dass in diesem Beispiel eine Tabellenansicht verwendet wird, es könnte sich aber auch um eine Sammlungsansicht handeln.
quelle
SVPullToRefresh
, wie man es programmgesteuert herunterzieht?[tableView triggerPullToRefresh];
" Siehe: github.com/samvermette/ SVPullToRefreshscrollView.contentOffset = CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height)
Der bereits erwähnte Ansatz:
würde den Spinner sichtbar machen. Aber es würde nicht animieren. Das einzige, was ich geändert habe, ist die Reihenfolge dieser beiden Methoden und alles hat funktioniert:
quelle
Für Swift 4 / 4.1
Eine Mischung aus vorhandenen Antworten erledigt den Job für mich:
Hoffe das hilft!
quelle
Siehe auch diese Frage
UIRefreshControl wird beim Aufrufen von beginRefreshing nicht angezeigt, und contentOffset ist 0
Für mich sieht es nach einem Fehler aus, da er nur auftritt, wenn die contentOffset-Eigenschaft der tableView 0 ist
Ich habe das mit folgendem Code behoben (Methode für den UITableViewController):
quelle
beginRefreshing
, nur, dass sich sein Status ändert. Aus meiner Sicht soll verhindert werden, dass die Aktualisierungsaktion zweimal gestartet wird, sodass möglicherweise eine programmgesteuert aufgerufene Aktualisierung weiterhin ausgeführt wird und eine vom Benutzer initiierte Aktion keine weitere startet.Hier ist Swift 3 und eine spätere Erweiterung, die sowohl Spinner als auch Animationen zeigt.
quelle
asyncAfter
ist eigentlich, was die Spinner-Animation funktioniert (iOS 12.3 / Xcode 10.2)Es funktioniert perfekt für mich:
Swift 3:
quelle
Für Swift 5 fehlte mir nur der Anruf
refreshControl.sendActions(.valueChanged)
. Ich habe eine Erweiterung gemacht, um es sauberer zu machen.quelle
Neben @Dymitry Shevchenko Lösung.
Ich habe eine gute Lösung für dieses Problem gefunden. Sie können eine Erweiterung für
UIRefreshControl
diese Überschreibungsmethode erstellen :Sie können eine neue Klasse verwenden, indem Sie im Identitätsinspektor eine benutzerdefinierte Klasse für die Aktualisierungssteuerung in Interface Builder festlegen.
quelle
Fort Swift 2.2+
quelle
Wenn Sie Rxswift für Swift 3.1 verwenden, können Sie Folgendes verwenden:
Diese Arbeit für Swift 3.1, iOS 10.
quelle
sendActions
Auslöserrx
, der diese Antwort in Bezug auf denRxSwift
Fall macht, dass sich jemand auf den ersten Blick wundertself.tableView.setContentOffset(CGPoint(x:0, y:self.tableView.contentOffset.y - (refreshControl.frame.size.height)), animated: true)
getestet auf Swift 5
Verwenden Sie dies in
viewDidLoad()
quelle
Ich verwende die gleiche Technik, um dem Benutzer das visuelle Zeichen "Daten werden aktualisiert" anzuzeigen. Ein Ergebnis, das Benutzer aus dem Hintergrund mitbringen, und Feeds / Listen werden mit der Benutzeroberfläche aktualisiert, so wie Benutzer Tabellen ziehen, um sich selbst zu aktualisieren. Meine Version enthält 3 Dinge
1) Wer sendet "wach auf"
2) Beobachter in UIViewController
3) Das Protokoll
quelle