Apenas curioso, pois não parece imediatamente possível, mas existe uma maneira sorrateira de aproveitar a nova UIRefreshControl
classe iOS 6 sem usar uma UITableViewController
subclasse?
Costumo usar a UIViewController
com uma UITableView
subvisão e me conformar UITableViewDataSource
e UITableViewDelegate
ao invés de usar uma UITableViewController
objetiva direta.
UITableViewController
e registrar um bug solicitando a API para usar umUIRefreshControl
com umUITableView
diretamente.Respostas:
Em um palpite, e com base na inspiração do DrummerB, tentei simplesmente adicionar uma
UIRefreshControl
instância como uma subvisão à minhaUITableView
. E magicamente funciona!Isso adiciona uma
UIRefreshControl
exibição acima da sua tabela e funciona conforme o esperado, sem a necessidade de usar umUITableViewController
:)EDIT: Isso acima ainda funciona, mas como alguns já apontaram, há uma leve "gagueira" ao adicionar o UIRefreshControl dessa maneira. Uma solução para isso é instanciar um UITableViewController e, em seguida, definir UIRefreshControl e UITableView para isso, ou seja:
fonte
-[UITableViewController setRefreshControl:]
) continuará funcionando.handleRefresh:
há uma mudança inesperada no valor da visualização de rolagemcontentInsets
por uma fração de segundo. Alguém mais experimentou isso ou tem uma solução? (Sim, eu sei que isso não é suportado, em primeiro lugar!) #UITableViewController
e você estará "fazendo o certo".[_tableView insertSubview:_refreshControl atIndex:0];
. Testado com iOS 7 e 8;)Para eliminar a gagueira causada pela resposta aceita, você pode atribuir
UITableView
a aUITableViewController
.EDITAR:
Uma maneira de adicionar um
UIRefreshControl
sem noUITableViewController
com gagueira e manter a boa animação depois de atualizar os dados na visualização da tabela.Mais tarde, ao manipular os dados atualizados ...
fonte
[_tablewViewController didMoveToParentViewController:self];
depois de adicionar a subvisão.self.tableView = _tableViewController.tableView;
deveria ser_tableViewController.tableView = self.tableView
O que você tentaria é usar a exibição de contêiner dentro do ViewController que você está usando. você pode definir a subclasse UITableViewController limpa com tableview dedicado e colocá-la no ViewController.
fonte
self.childViewControllers.firstObject
.prepareForSegue
para obter uma referência ao objeto UITableViewController em uma exibição de contêiner, pois isso é imediatamente acionado como um evento segue na instanciação do storyboard.Bem, o UIRefreshControl é uma subclasse UIView, para que você possa usá-lo por conta própria. Eu não tenho certeza, no entanto, como ele se processa. A renderização pode simplesmente depender do quadro, mas também pode depender de um UIScrollView ou UITableViewController.
De qualquer forma, será mais um hack do que uma solução elegante. Eu recomendo que você procure um dos clones de terceiros disponíveis ou escreva o seu.
ODRefreshControl
SlimeRefresh
fonte
Tente atrasar a chamada para o
-endRefresh
método refreshControl por uma fração de segundo após o tableView recarregar seu conteúdo, usando NSObject-performSelector:withObject:afterDelay:
ou GCDdispatch_after
.Eu criei uma categoria no UIRefreshControl para isso:
Eu testei e isso também funciona em vistas de coleção. Percebi que um atraso tão pequeno quanto 0,01 segundos é suficiente:
fonte
UIRefreshControl
.[self performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.01]
-performSelector:withObject:afterDelay:
ou GCD para isso depende de uma questão de gosto pessoal.é simples
Se você quiser aprender sobre o iOS 10 UIRefreshControl, leia aqui .
fonte
Adicionar o controle de atualização como uma subvisão cria um espaço vazio acima dos cabeçalhos das seções.
Em vez disso, incorporei um UITableViewController ao meu UIViewController e alterei minha
tableView
propriedade para apontar para o incorporado, e viola! Alterações mínimas de código. :-)Passos:
@IBOutlet weak var tableView: UITableView!
por um do UITableViewController recém-incorporado, conforme mostrado abaixofonte
Para Swift 2.2.
Primeiro faça UIRefreshControl ().
No seu método viewDidLoad (), adicione:
E faça a função de atualização
fonte
Aqui está outra solução que é um pouco diferente.
Eu tive que usá-lo devido a alguns problemas de hierarquia de exibição que eu tinha: eu estava criando algumas funcionalidades que exigiam a passagem de visualizações para lugares diferentes na hierarquia de exibições, que eram quebradas ao usar a visualização de tabela de um UITableViewController porque a tableView é a visualização raiz do UITableViewController ( self.view) e não apenas uma visão regular, ele criou hierarquias inconsistentes de controlador / visão e causou uma falha.
Crie basicamente sua própria subclasse de UITableViewController e substitua o loadView para atribuir self.view a uma exibição diferente e substitua a propriedade tableView para retornar uma visualização de tabela separada.
por exemplo:
Quando combinado com a solução da Keller, isso será mais robusto no sentido de que o tableView agora é uma visualização regular, não uma visualização raiz do VC, e será mais robusto contra alterações nas hierarquias de visualização. Exemplo de uso desta maneira:
Há outro uso possível para isso:
Como a subclassificação dessa maneira separa self.view de self.tableView, agora é possível usar esse UITableViewController como um controlador comum e adicionar outras subviews ao self.view sem as peculiaridades de adicionar subviews ao UITableView, portanto, pode-se considerar fazer suas visualize controladores diretamente uma subclasse de UITableViewController em vez de ter filhos UITableViewController.
Algumas coisas a observar:
Como estamos substituindo a propriedade tableView sem chamar super, pode haver algumas coisas a serem observadas e que devem ser tratadas sempre que necessário. Por exemplo, configurar a tableview no exemplo acima não adicionará a tableview a self.view e não definirá o quadro que você deseja fazer. Além disso, nesta implementação, não é fornecido tableView padrão quando a classe é instanciada, o que também é algo que você pode considerar adicionar. Não o incluo aqui porque é caso a caso, e essa solução realmente se encaixa bem na solução de Keller.
fonte
Tente isso,
As soluções acima são boas, mas o tableView.refreshControl está disponível apenas para UITableViewController, até o iOS 9.xe vem no UITableView a partir do iOS 10.x em diante.
Escrito em Swift 3 -
fonte
A primeira sugestão de Keller causa um bug estranho no iOS 7, em que a inserção da tabela é aumentada após o controlador de exibição reaparecer. Mudar para a segunda resposta, usando o uitableviewcontroller, corrigiu as coisas para mim.
fonte
Acontece que você pode usar o seguinte quando usa um UIViewController com uma subvisão UITableView e está em conformidade com UITableViewDataSource e UITableViewDelegate:
fonte
self.refreshControl
é uma propriedade para aUITableViewController
, não aUIViewController
.