Puxe para atualizar o UITableView sem UITableViewController

180

Estou tentando implementar um recurso para atualizar em um UITableView dentro de um UIViewController. Não posso usar um UITableViewController porque quero que o UITableView seja uma subvisão menor no controlador de exibição, com algumas outras coisas acima. Presumo que isso seja possível, mas alguém viu uma implementação disso?

Daniel Robinson
fonte

Respostas:

465

Adicione um controle de atualização diretamente a um UITableViewsem usar a 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
fonte
1
Excelente e fácil. Funciona para mim quando tentei em uma exibição de tabela adicionada ao UIViewController no iOS 7.0.4.
Thandasoru
5
alguém já teve o problema em que o controle em si não é visível, mas parece funcionar bem?
Remotevision 20/03
16
A exibição de tabela parece pular inesperadamente quando ela "clica". Ainda não sei por que.
Bob Spryn
3
Descobri que ele precisa ir em viewDidAppear, não tenho certeza se isso é uma característica iOS 7 - Eu ainda estou para testá-lo no iOS 8 ...
Jack Solomon
4
O refreshControl aparece na parte superior do tableView. Eu reparei isso: tableView.insertSubview(refreshControl, atIndex: 0)em vez detableView.addSubview(refreshControl)
kbpontius
12

Objetivo-C :

É assim que você pode implementar o pull para atualizar para a visualização da tabela. O mesmo que no caso da exibição de coleção. Apenas substitua a alocação da exibição de tabela pela exibição de coleção.

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
fonte
Como a versão obj-c tem apenas 9 upvotes quando a versão rápida tem> 430?
Perseguição Roberts
1
@ChaseRoberts, que foi respondido em 13 de fevereiro, dê uma olhada no histórico de edições, originalmente no objetivo-c. Como naquele momento o swift era novo, todos procuravam uma versão rápida ... stackoverflow.com/posts / 15010646 / revisions
Irfan
4

Esta solução do @berik funciona bem, mas o UIController é exibido na parte superior do UITableViewController. A maneira de corrigi-lo é fazer essa alteração:

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
fonte
3
O refreshControl aparece na parte superior do tableView para mim, mas sua sugestão faz com que o meu refreshControldesapareça, não apareça abaixo do tableView. Eu consertei isso por: tableView.insertSubview (refreshControl, atIndex: 0) em vez de tableView.addSubview (refreshControl)
kbpontius
3

Eu implementei o EGORefreshTableHeaderView com um UIViewController e uma visualização de tabela simples, o truque é que, nos locais onde o EGO adota uma visualização de rolagem como parâmetro, se você olhar a própria tabela herda da visualização de rolagem.

Requer apenas isso e algumas conexões extras :)

Espero que isto ajude.

Juan Alberto López Cavallotti
fonte
-1

Parece que se você criar o UIRefreshControl dentro do método loadView do viewController tudo funcionará bem. O UIRefreshControl se comporta como deveria. Testado com iOS 7.1 e iOS 8.2

Giannis Giannopoulos
fonte
-1

Acabei usando ODRefreshControl . Ele não precisa de nenhum hack como o descrito acima tableView.backgroundView = refreshControl, funciona quase da mesma maneira e oferece uma interface de usuário mais bonita.

Alex Bin Zhao
fonte