Nur neugierig, da es nicht sofort möglich erscheint, aber gibt es eine hinterhältige Möglichkeit, die neue iOS 6- UIRefreshControl
Klasse ohne Verwendung einer UITableViewController
Unterklasse zu nutzen?
Ich benutze oft ein UIViewController
mit einer UITableView
Unteransicht und passe mich an UITableViewDataSource
und UITableViewDelegate
anstatt ein UITableViewController
direktes zu verwenden.
UITableViewController
und einen Fehler melden , der die API auffordert, aUIRefreshControl
mit aUITableView
direkt zu verwenden.Antworten:
Aus Ahnung und basierend auf DrummerBs Inspiration habe ich versucht, einfach eine
UIRefreshControl
Instanz als Unteransicht zu meiner hinzuzufügenUITableView
. Und es funktioniert auf magische Weise!Dies fügt eine
UIRefreshControl
über Ihrer Tabellenansicht hinzu und funktioniert wie erwartet, ohne einUITableViewController
:) verwenden zu müssenBEARBEITEN: Dies funktioniert immer noch, aber wie einige darauf hingewiesen haben, gibt es ein leichtes "Stottern", wenn das UIRefreshControl auf diese Weise hinzugefügt wird. Eine Lösung hierfür besteht darin, einen UITableViewController zu instanziieren und dann Ihr UIRefreshControl und UITableView darauf einzustellen, dh:
quelle
-[UITableViewController setRefreshControl:]
) weiterhin funktioniert.handleRefresh:
für den BruchteilcontentInsets
einer Sekunde eine unerwartete Wertänderung der Bildlaufansicht zu ergeben . Hat dies noch jemand erlebt oder eine Lösung dafür gefunden? (Ja, ich weiß, dass dies überhaupt nicht unterstützt wird!)UITableViewController
und Sie werden "es richtig machen".[_tableView insertSubview:_refreshControl atIndex:0];
. Getestet mit iOS 7 und 8;)Um das durch die akzeptierte Antwort verursachte Ruckeln zu beseitigen, können Sie Ihr
UITableView
a zuweisenUITableViewController
.BEARBEITEN:
Eine Möglichkeit, ein
UIRefreshControl
NeinUITableViewController
ohne Stottern hinzuzufügen und die schöne Animation nach dem Aktualisieren der Daten in der Tabellenansicht beizubehalten.Später beim Umgang mit den aktualisierten Daten ...
quelle
[_tablewViewController didMoveToParentViewController:self];
nach dem Hinzufügen der Unteransicht anzurufen.self.tableView = _tableViewController.tableView;
sollte sein_tableViewController.tableView = self.tableView
Sie würden versuchen, die Containeransicht in dem von Ihnen verwendeten ViewController zu verwenden. Sie können eine saubere UITableViewController-Unterklasse mit dedizierter Tabellenansicht definieren und diese in den ViewController einfügen.
quelle
self.childViewControllers.firstObject
.prepareForSegue
, um einen Verweis auf das UITableViewController-Objekt in einer Containeransicht abzurufen, da dies bei der Instanziierung aus dem Storyboard sofort als Segue-Ereignis ausgelöst wird.Nun, UIRefreshControl ist eine UIView-Unterklasse, sodass Sie sie alleine verwenden können. Ich bin mir allerdings nicht sicher, wie es sich selbst wiedergibt. Das Rendern kann einfach vom Frame abhängen, aber auch von einem UIScrollView oder dem UITableViewController.
In jedem Fall wird es eher ein Hack als eine elegante Lösung sein. Ich empfehle Ihnen, sich einen der verfügbaren Klone von Drittanbietern anzusehen oder einen eigenen zu schreiben.
ODRefreshControl
SlimeRefresh
quelle
Versuchen Sie, den Aufruf der refreshControl-
-endRefresh
Methode um einen Bruchteil einer Sekunde zu verzögern, nachdem die tableView ihren Inhalt neu geladen hat, entweder mithilfe von NSObjects-performSelector:withObject:afterDelay:
oder GCDsdispatch_after
.Ich habe dafür eine Kategorie auf UIRefreshControl erstellt:
Ich habe es getestet und dies funktioniert auch in Sammlungsansichten. Mir ist aufgefallen, dass eine Verzögerung von nur 0,01 Sekunden ausreicht:
quelle
UIRefreshControl
.[self performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.01]
-performSelector:withObject:afterDelay:
oder GCD verwendet wird, hängt vom persönlichen Geschmack ab.Es ist einfach
Wenn Sie mehr über iOS 10 UIRefreshControl erfahren möchten, lesen Sie hier .
quelle
Durch Hinzufügen des Aktualisierungssteuerelements als Unteransicht wird ein leerer Bereich über den Abschnittsüberschriften erstellt.
Stattdessen habe ich einen UITableViewController in meinen UIViewController eingebettet und dann meine
tableView
Eigenschaft so geändert , dass sie auf die eingebettete zeigt, und Viola! Minimale Codeänderungen. :-)Schritte:
@IBOutlet weak var tableView: UITableView!
durch den neu eingebetteten UITableViewController (siehe unten)quelle
Für Swift 2.2.
Machen Sie zuerst UIRefreshControl ().
Fügen Sie in Ihrer viewDidLoad () -Methode Folgendes hinzu:
Und Aktualisierungsfunktion erstellen
quelle
Hier ist eine andere Lösung, die etwas anders ist.
Ich musste es aufgrund einiger Probleme mit der Ansichtshierarchie verwenden: Ich erstellte einige Funktionen, die das Weitergeben von Ansichten an verschiedene Stellen in der Ansichtshierarchie erforderten, was bei Verwendung der Tabellenansicht eines UITableViewController fehlerhaft war. B / c Die Tabellenansicht ist die Stammansicht des UITableViewController ( self.view) und nicht nur eine reguläre Ansicht, sondern inkonsistente Controller- / Ansichtshierarchien erstellt und einen Absturz verursacht.
Erstellen Sie im Grunde eine eigene Unterklasse von UITableViewController und überschreiben Sie loadView, um self.view eine andere Ansicht zuzuweisen, und überschreiben Sie die tableView-Eigenschaft, um eine separate Tabellenansicht zurückzugeben.
beispielsweise:
In Kombination mit Kellers Lösung ist dies robuster in dem Sinne, dass die tableView jetzt eine reguläre Ansicht ist, nicht die Stammansicht eines VC, und robuster gegen sich ändernde Ansichtshierarchien ist. Beispiel für die Verwendung auf diese Weise:
Es gibt eine andere mögliche Verwendung dafür:
Da die Unterklasse auf diese Weise self.view von self.tableView trennt, ist es jetzt möglich, diesen UITableViewController eher als regulären Controller zu verwenden und self.view andere Unteransichten hinzuzufügen, ohne dass UITableView seltsamerweise Unteransichten hinzugefügt werden muss Zeigen Sie Controller direkt als Unterklasse von UITableViewController an, anstatt UITableViewController-Kinder zu haben.
Einige Dinge, auf die Sie achten sollten:
Da wir die tableView-Eigenschaft überschreiben, ohne super aufzurufen, müssen möglicherweise einige Dinge beachtet werden, die bei Bedarf behandelt werden sollten. Wenn Sie beispielsweise die Tabellenansicht in meinem obigen Beispiel festlegen, wird die Tabellenansicht nicht zu self.view hinzugefügt und der Rahmen, den Sie möglicherweise ausführen möchten, nicht festgelegt. In dieser Implementierung wird Ihnen auch keine Standard-Tabellenansicht gegeben, wenn die Klasse instanziiert wird. Dies können Sie auch hinzufügen. Ich füge es hier nicht ein, weil das von Fall zu Fall ist und diese Lösung tatsächlich gut zu Kellers Lösung passt.
quelle
Versuche dies,
Die oben genannten Lösungen sind in Ordnung, aber tableView.refreshControl ist nur für UITableViewController bis iOS 9.x verfügbar und ab iOS 10.x in UITableView verfügbar.
Geschrieben in Swift 3 -
quelle
Kellers erster Vorschlag verursacht einen seltsamen Fehler in iOS 7, bei dem der Einschub der Tabelle vergrößert wird, nachdem der View Controller wieder angezeigt wird. Der Wechsel zur zweiten Antwort mit dem uitableviewcontroller hat die Dinge für mich behoben.
quelle
Es stellt sich heraus, dass Sie Folgendes verwenden können, wenn Sie einen UIViewController mit einer UITableView-Unteransicht verwenden und UITableViewDataSource und UITableViewDelegate entsprechen:
quelle
self.refreshControl
ist eine Eigenschaft für aUITableViewController
, nicht für aUIViewController
.