Pociągnij, aby odświeżyć UITableView bez UITableViewController

180

Usiłuję zaimplementować funkcję pull to refresh w UITableView w UIViewController. Nie mogę użyć UITableViewController, ponieważ chcę, aby UITableView był mniejszym widokiem podrzędnym w kontrolerze widoku, a niektóre inne rzeczy nad nim. Zakładam, że jest to możliwe, ale czy ktoś widział jego wdrożenie?

Daniel Robinson
źródło

Odpowiedzi:

465

Dodaj kontrolkę odświeżania bezpośrednio do a UITableViewbez użycia 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
źródło
1
Doskonałe i łatwe. Działa to dla mnie, gdy próbowałem go w widoku tabeli dodanym do UIViewController na iOS 7.0.4.
thandasoru
5
czy ktoś miał problem z tym, że sama kontrola nie jest widoczna, ale poza tym wydaje się działać dobrze?
transmisja
16
Widok tabeli wydaje się nieoczekiwanie przeskakiwać po „kliknięciu”. Nie wiem jeszcze dlaczego.
Bob Spryn
3
Przekonałem się, że musi przejść w widokudidappear, nie jestem pewien, czy jest to funkcja iOS 7 - Jeszcze go przetestuję w iOS 8 ...
Jack Solomon
4
RefreshControl pojawia się na górze tableView. Naprawiłem to przez: tableView.insertSubview(refreshControl, atIndex: 0)zamiasttableView.addSubview(refreshControl)
kbpontius
12

Cel C :

W ten sposób możesz zaimplementować ściąganie w celu odświeżenia widoku tabeli. Taki sam jak w przypadku widoku kolekcji. Po prostu zastąp przydział widoku tabeli widokiem kolekcji.

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
źródło
W jaki sposób wersja obj-c ma tylko 9 upvotes tylko wtedy, gdy szybka wersja ma> 430?
Chase Roberts
1
@ChaseRoberts, Na którą odpowiedziano 13 lutego, spójrz na historię edycji, pierwotnie była ona w celu-c, ponieważ w tym czasie swift był nowy, każdy szukał szybkiej wersji ... stackoverflow.com/posts / 15010646 / wersje
Irfan
4

To rozwiązanie @berik działa dobrze, ale UIController jest wyświetlany na górze UITableViewController. Sposób, aby to naprawić, polega na zmianie:

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
źródło
3
RefreshControl pojawia się u góry tabeliView, ale twoja sugestia sprawia, że ​​moje refreshControlznikają, a nie pojawiają się poniżej tableView. Naprawiłem to przez: tableView.insertSubview (refreshControl, atIndex: 0) zamiast tableView.addSubview (refreshControl)
kbpontius
3

Zaimplementowałem EGORefreshTableHeaderView z UIViewController i prostym widokiem tabeli, sztuczka polega na tym, że w miejscach, w których EGO przyjmuje widok przewijania jako parametr, jeśli spojrzysz, sam widok tabeli dziedziczy z widoku przewijania.

Wymaga tylko tego i kilku dodatkowych połączeń :)

Mam nadzieję że to pomoże.

Juan Alberto López Cavallotti
źródło
-1

Wygląda na to, że jeśli utworzysz UIRefreshControl w metodzie loadView viewController , wszystko działa poprawnie. UIRefreshControl zachowuje się tak, jak powinien. Testowane z iOS 7.1 i iOS 8.2

Giannis Giannopoulos
źródło
-1

Skończyło się na użyciu ODRefreshControl . Nie wymaga żadnego włamania jak wyżej tableView.backgroundView = refreshControl, działa prawie w ten sam sposób i zapewnia lepiej wyglądający interfejs użytkownika.

Alex Bin Zhao
źródło