Ziehen Sie, um UITableView ohne UITableViewController zu aktualisieren

180

Ich versuche, eine Pull-to-Refresh-Funktion in einer UITableView in einem UIViewController zu implementieren. Ich kann keinen UITableViewController verwenden, da ich möchte, dass UITableView eine kleinere Unteransicht im View Controller ist, mit einigen anderen Dingen darüber. Ich nehme an, dass dies möglich ist, aber hat jemand eine Implementierung davon gesehen?

Daniel Robinson
quelle

Antworten:

465

Fügen Sie ein Aktualisierungssteuerelement direkt zu a hinzu, UITableViewohne Folgendes zu verwenden UITableViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)

    if #available(iOS 10.0, *) {
        tableView.refreshControl = refreshControl
    } else {
        tableView.backgroundView = refreshControl
    }
}

@objc func refresh(_ refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}
Berik
quelle
1
Hervorragend und einfach. Es funktioniert für mich, als ich es in einer Tabellenansicht ausprobiert habe, die UIViewController unter iOS 7.0.4 hinzugefügt wurde.
Thandasoru
5
Hat jemand das Problem gehabt, dass das Steuerelement selbst nicht sichtbar ist, aber ansonsten gut zu funktionieren scheint?
Remotevision
16
Die Tabellenansicht scheint unerwartet nach unten zu springen, sobald sie "klickt". Ich weiß noch nicht warum.
Bob Spryn
3
Ich fand, dass es in viewdidappear gehen muss, nicht sicher, ob das eine iOS 7-Funktion ist - ich muss es noch in iOS 8 testen ...
Jack Solomon
4
Das refreshControl wird oben in der tableView angezeigt. Ich habe dies behoben durch: tableView.insertSubview(refreshControl, atIndex: 0)anstelle vontableView.addSubview(refreshControl)
kbpontius
12

Ziel-C :

Auf diese Weise können Sie Pull-to-Refresh für die Tabellenansicht implementieren. Gleich wie bei der Sammlungsansicht. Ersetzen Sie einfach die Zuordnung der Tabellenansicht durch die Sammlungsansicht.

UITableView *tableViewDemo  =  [[UITableView alloc]init];
tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
tableViewDemo.dataSource =  self;
tableViewDemo.delegate =  self;
[self.view addSubView: tableViewDemo];

UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
[refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[tableViewDemo addSubview:refreshController];

#pragma mark - Handle Refresh Method

-(void)handleRefresh : (id)sender
{
   NSLog (@"Pull To Refresh Method Called");
   [refreshController endRefreshing];
}
Manish Methani
quelle
Wie hat die obj-c-Version nur 9 Upvotes, wenn die schnelle Version> 430 hat?
Chase Roberts
1
@ChaseRoberts, Das wird am 13. Februar beantwortet, schaut euch den Bearbeitungsverlauf an, ursprünglich war es in Objective-C. Da Swift zu dieser Zeit neu war, suchte jeder nach einer schnellen Version ... stackoverflow.com/posts / 15010646 / revisions
Irfan
4

Diese Lösung von @berik funktioniert einwandfrei, aber der UIController wird über dem UITableViewController angezeigt. Der Weg, dies zu beheben, besteht darin, diese Änderung vorzunehmen:

override func viewDidLoad() {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    tableView.backgroundView = refreshControl // <- THIS!!!
}

func refresh(refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}
Andres
quelle
3
Das refreshControl wird für mich oben in der Tabellenansicht angezeigt, aber Ihr Vorschlag lässt mich refreshControlverschwinden und nicht unter dem tableView. Ich habe dies behoben durch: tableView.insertSubview (refreshControl, atIndex: 0) anstelle von tableView.addSubview (refreshControl)
kbpontius
3

Ich habe EGORefreshTableHeaderView mit einem UIViewController und einer einfachen Tabellenansicht implementiert. Der Trick besteht darin, dass an den Stellen, an denen EGO eine Bildlaufansicht als Parameter verwendet, die Tabellenansicht selbst von der Bildlaufansicht erbt.

Es erfordert nur das und ein paar zusätzliche Verbindungen :)

Hoffe das hilft.

Juan Alberto López Cavallotti
quelle
-1

Wenn Sie das UIRefreshControl in der loadView- Methode von viewController erstellen , funktioniert anscheinend alles einwandfrei . Das UIRefreshControl verhält sich wie es sollte. Getestet mit iOS 7.1 und iOS 8.2

Giannis Giannopoulos
quelle
-1

Am Ende habe ich ODRefreshControl verwendet . Es benötigt keinen Hack wie oben tableView.backgroundView = refreshControl, funktioniert fast genauso und bietet eine besser aussehende Benutzeroberfläche.

Alex Bin Zhao
quelle