Eu configurei um UIRefreshControl em meu UITableViewController (que está dentro de um UINavigationController) e funciona como esperado (ou seja, puxar para baixo dispara o evento correto). No entanto, se eu invocar programaticamente o beginRefreshing
método de instância no controle de atualização, como:
[self.refreshControl beginRefreshing];
Nada acontece. Deve animar para baixo e mostrar o botão giratório. O endRefreshing
método funciona corretamente quando eu chamo isso após a atualização.
Eu criei um projeto de protótipo básico com esse comportamento e ele funciona corretamente quando meu UITableViewController é adicionado diretamente ao controlador de visualização raiz do delegado do aplicativo, por exemplo:
self.viewController = tableViewController;
self.window.rootViewController = self.viewController;
Mas se eu adicionar o tableViewController
a um UINavigationController primeiro e, em seguida, adicionar o controlador de navegação como o rootViewController
, o beginRefreshing
método não funcionará mais. Por exemplo
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableViewController];
self.viewController = navController;
self.window.rootViewController = self.viewController;
Minha impressão é que isso tem algo a ver com as hierarquias de visualização aninhadas dentro do controlador de navegação que não funcionam bem com o controle de atualização - alguma sugestão?
obrigado
UITableViewController possui a propriedade automaticallyAdjustsScrollViewInsets após o iOS 7. A visualização da tabela já pode ter contentOffset, geralmente (0, -64).
Portanto, a maneira certa de mostrar refreshControl depois de começar a atualizar de maneira programada é adicionar a altura de refreshControl ao contentOffset existente.
fonte
-64
é melhor usar-self.topLayoutGuide.length
Aqui está uma extensão do Swift usando as estratégias descritas acima.
fonte
sendActionsForControlEvents(UIControlEvents.ValueChanged)
no final desta função, caso contrário, a lógica de atualização real não será executada.Nenhuma das outras respostas funcionou para mim. Eles fariam com que o botão giratório mostrasse e girasse, mas a ação de atualização em si nunca aconteceria. Isso funciona:
Observe que este exemplo usa uma visão de tabela, mas poderia muito bem ser uma visão de coleção.
fonte
SVPullToRefresh
, como puxá-lo programaticamente?[tableView triggerPullToRefresh];
" Consulte: github.com/samvermette/ SVPullToRefreshscrollView.contentOffset = CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height)
A abordagem já mencionada:
tornaria o botão giratório visível. Mas não animava. A única coisa que mudei foi a ordem desses dois métodos e tudo funcionou:
fonte
Para Swift 4 / 4.1
Uma combinação de respostas existentes faz o trabalho para mim:
Espero que isto ajude!
fonte
Veja também esta questão
UIRefreshControl não mostra spiny ao chamar beginRefreshing e contentOffset é 0
Parece um bug para mim, porque só ocorre quando a propriedade contentOffset de tableView é 0
Corrigi isso com o seguinte código (método para o UITableViewController):
fonte
beginRefreshing
, apenas que seu estado muda. A meu ver, é para evitar que a ação de atualização seja iniciada duas vezes, de modo que, se uma atualização chamada programaticamente ainda estiver em execução, uma ação iniciada pelo usuário não iniciará outra.Aqui está o Swift 3 e uma extensão posterior que mostra o spinner e também o anima.
fonte
asyncAfter
é realmente o que torna o trabalho de animação girador (iOS 12,3 / Xcode 10.2)Funciona perfeitamente para mim:
Swift 3:
fonte
Para o Swift 5, para mim, só faltou ligar
refreshControl.sendActions(.valueChanged)
. Fiz uma extensão para torná-la mais limpa.fonte
Além da solução @Dymitry Shevchenko.
Eu encontrei uma boa solução para esse problema. Você pode criar uma extensão para
UIRefreshControl
esse método de substituição:Você pode usar a nova classe definindo uma classe personalizada no Identity Inspector para controle de atualização no Interface Builder.
fonte
Fort Swift 2.2+
fonte
Se você usa Rxswift para swift 3.1, pode usar abaixo:
Isso funciona para o swift 3.1, iOS 10.
fonte
sendActions
gatilhorx
que torna esta resposta relacionada aoRxSwift
caso de alguém estar se perguntando à primeira vistaself.tableView.setContentOffset(CGPoint(x:0, y:self.tableView.contentOffset.y - (refreshControl.frame.size.height)), animated: true)
testado em Swift 5
use isso em
viewDidLoad()
fonte
Eu uso a mesma técnica para mostrar ao usuário o sinal visual "dados são atualização". Um resultado do usuário traz o aplicativo do fundo e os feeds / listas serão atualizados com a interface do usuário, como os usuários puxam as tabelas para se refrescar. Minha versão contém 3 coisas
1) Quem manda "acordar"
2) Observador em UIViewController
3) O protocolo
fonte