Estou construindo um leitor de RSS usando o swift e preciso implementar pull para recarregar a funcionalidade.
Aqui está como eu estou tentando fazer isso.
class FirstViewController: UIViewController,
UITableViewDelegate, UITableViewDataSource {
@IBOutlet var refresh: UIScreenEdgePanGestureRecognizer
@IBOutlet var newsCollect: UITableView
var activityIndicator:UIActivityIndicatorView? = nil
override func viewDidLoad() {
super.viewDidLoad()
self.newsCollect.scrollEnabled = true
// Do any additional setup after loading the view, typically from a nib.
if nCollect.news.count <= 2{
self.collectNews()
}
else{
self.removeActivityIndicator()
}
view.addGestureRecognizer(refresh)
}
@IBAction func reload(sender: UIScreenEdgePanGestureRecognizer) {
nCollect.news = News[]()
return newsCollect.reloadData()
}
Estou obtendo :
A propriedade 'self.refresh' não foi inicializada na chamada super.init
Por favor, ajude-me a entender o comportamento dos reconhecedores de gestos. Um código de exemplo funcional será uma grande ajuda.
Obrigado.
ios
swift
xcode
uirefreshcontrol
xrage
fonte
fonte
Respostas:
Puxe para atualizar é construído no iOS. Você poderia fazer isso rapidamente
Em algum momento você pode terminar de atualizar.
fonte
Uma solução com storyboard e rapidez ...
1.) Abra o arquivo .storyboard, selecione um TableViewController no storyboard e "Ative" o recurso Table View Controller - Refreshing nos Utilitários.
2.) Abra a classe UITableViewController associada e adicione a seguinte linha ao método viewDidLoad.
Editado para o Swift 5.0:
OU no Swift 2.2:
3.) Adicione o seguinte método acima do método viewDidLoad
fonte
put self.tableView.reloadData()
eself.refreshControl?.endRefreshing()
no retorno de chamada?reloadData()
na fila principal para atualizar sua interface do usuário instantaneamente:dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
Gostaria de mencionar um recurso BONITO FRESCO que foi incluído desde o iOS 10, que é:
Por enquanto, o UIRefreshControl é diretamente suportado em cada um dos
UICollectionView
,UITableView
eUIScrollView
!Cada uma dessas visualizações possui a propriedade refreshControl da instância, o que significa que não é mais necessário adicioná-la como uma subview na visualização de rolagem , tudo o que você precisa fazer é:
Pessoalmente, acho mais natural tratá-lo como uma propriedade da visualização de rolagem do que adicioná-la como uma subvisão, especialmente porque a única visualização apropriada para ser uma superview para um UIRefreshControl é uma visualização de rolagem, ou seja, a funcionalidade de usar UIRefreshControl é apenas útil ao trabalhar com uma exibição de rolagem; É por isso que essa abordagem deve ser mais óbvia para configurar a exibição do controle de atualização.
No entanto, você ainda tem a opção de usar o
addSubview
baseado na versão do iOS:fonte
doSomething
função, se estiver acessível, você deve verificar seu código.Swift 4
E você pode parar de atualizar com:
fonte
tableView.reloadData()
no seu exemplo!var refControl: UIRefreshControl{ let rfControl = UIRefreshControl() rfControl.attributedTitle = NSAttributedString(string: "") rfControl.tintColor = UIColor(red:0.16, green:0.68, blue:0.9, alpha:1) rfControl.addTarget(self, action: #selector(getNewMessageList), for: .valueChanged) return rfControl }
. Em seguida, chame endRefreshing (), não está funcionando (o refreshcontrol ainda aparece lá), mas siga seu caminho, funcionou, por favor, deixe-me saber por que?.valueChanged
evento é acionado? Eu não entendo essa conexão.No Swift, use isso,
Se você deseja ter um pull para atualizar no WebView,
Então tente este código:
fonte
A resposta de Anhil me ajudou muito.
No entanto, depois de experimentar mais, notei que a solução sugerida às vezes causa uma falha na interface do usuário não tão bonita .
Em vez disso, seguindo essa abordagem * fez o truque para mim.
* Swift 2.1
fonte
O que o erro está dizendo é que
refresh
não foi inicializado. Observe que você optou porrefresh
não ser opcional, o que no Swift significa que ele deve ter um valor antes de ligarsuper.init
(ou é chamado implicitamente, o que parece ser o seu caso). Ou façarefresh
opcional (provavelmente o que você deseja) ou inicialize-o de alguma forma.Eu sugeriria a leitura da documentação introdutória do Swift novamente, que cobre isso amplamente.
Uma última coisa, que não faz parte da resposta, como apontado por @Anil, existe uma atração interna para atualizar o controle no iOS chamado
UIRefresControl
, que pode ser algo que vale a pena investigar.fonte
Criei um aplicativo de feed RSS no qual tenho um recurso Puxar para atualizar que originalmente apresentava alguns dos problemas listados acima.
Mas, para adicionar às respostas dos usuários acima, eu estava procurando em todo lugar o meu caso de uso e não consegui encontrá-lo. Eu estava baixando dados da web (RSSFeed) e queria colocar na minha tabela a exibição de histórias para atualizar.
O que é mencionado acima cobre as áreas certas, mas com alguns dos problemas que as pessoas estão tendo, aqui está o que eu fiz e funciona:
Adotei a abordagem do @Blankarsch e fui para o main.storyboard e selecione a visualização da tabela para usar a atualização. O que não foi mencionado é a criação do IBOutlet e do IBAction para usar a atualização com eficiência.
Espero que isso ajude alguém na mesma situação que eu
fonte
fonte
Detalhes
Recursos
Solução
Uso
Amostra Completa
fonte
Swift 5
fonte
Sugiro fazer uma extensão do pull To Refresh para usar em todas as classes.
1) Crie um arquivo rápido e vazio: Arquivo - Novo - Arquivo - Arquivo Swift.
2) Adicione o seguinte
3) No Your View Controller, chame estes métodos como:
4) Em algum momento, você queria terminar a atualização:
fonte
Para o puxar para atualizar eu estou usando
DGElasticPullToRefresh
https://github.com/gontovnik/DGElasticPullToRefresh
Instalação
pod 'DGElasticPullToRefresh'
substituir func viewWillAppear (_ animado: Bool)
E não se esqueça de remover a referência enquanto a vista desaparecerá
Para remover o pull para atualizar, coloque esse código no seu
substituir func viewDidDisappear (_ animado: Bool)
E vai parecer
Feliz codificação :)
fonte
Você pode conseguir isso usando poucas linhas de código. Então, por que você ficará preso na biblioteca ou na interface do usuário de terceiros? Puxe para atualizar é construído no iOS. Você poderia fazer isso rapidamente
fonte
você pode usar esta subclasse de tableView:
1 - no construtor de interface altere a classe do seu tableView para
PullToRefreshTableView
ou crie umPullToRefreshTableView
programaticamente2 - implemente o
PullToRefreshTableViewDelegate
controlador no seu modo de exibição3 -
tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
será chamado no seu controlador de exibição quando a exibição da tabela começar a ser atualizada4 - ligue
yourTableView.endRefreshing()
para terminar a atualizaçãofonte
Foi assim que eu fiz o trabalho usando o Xcode 7.2, que eu acho que é um erro grave. Eu estou usando dentro do meu
UITableViewController
dentro do meuviewWillAppear
Como você pode ver, eu literalmente tenho que chamar o
configureMessage()
método depois de configurar o meuUIRefreshControl
e depois disso, as atualizações subsequentes funcionarão bem.fonte
Outras respostas estão corretas, mas para obter mais detalhes, verifique este post Puxe para atualizar
Ao trabalhar com um UITableViewController, a solução é bastante simples: primeiro, selecione o controlador de exibição de tabela em seu storyboard, abra o inspetor de atributos e ative a atualização:
Um UITableViewController é equipado com uma referência a um UIRefreshControl pronto para uso. Você só precisa conectar algumas coisas para iniciar e concluir a atualização quando o usuário puxa para baixo.
Na sua substituição de viewDidLoad (), adicione um destino para manipular a atualização da seguinte maneira:
refreshControl.endRefreshing()
Para mais informações, acesse o link Link e todo o crédito será referente a esse post
fonte