I have a code to show an activity indicator
in Swift, but it's not working properly.
The activity indicator
doesn't appear, even after all the code inside the configuration func
is loaded correctly.
What is going wrong in the code?
Here is the code and the image:
import UIKit
class SelecionaPaisViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating {
//MARK: - Outlets
@IBOutlet weak var paisesTableView: UITableView!
//MARK: - Propriedades
var paises = [PaisCodigo]()
var paisesFiltrado = [PaisCodigo]()
var controladorDeBusca: UISearchController!
var container: UIView = UIView()
var loadingView: UIView = UIView()
var indicadorDeAtividade: UIActivityIndicatorView!
//MARK: - Métodos reescritos da View
override func viewDidLoad() {
super.viewDidLoad()
paisesTableView.delegate = self
paisesTableView.dataSource = self
//Carrega configuração do SearchController
configurarControladorDeBusca()
//Carrega indicador de atividade
configurarIndicadorDeAtividade()
//Dados dos países
carregaDadosPaises()
//Configura comportamento da tabela
configuraComportamentoDaTabela()
}
override func viewDidAppear(animated: Bool) {
//Inicia
iniciaIndicadorDeAtividade()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Métodos da Table view data source
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if controladorDeBusca.active {
return paisesFiltrado.count
} else {
return paises.count
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("PaisCell", forIndexPath: indexPath)
let pais: PaisCodigo
if controladorDeBusca.active {
pais = paisesFiltrado[indexPath.row]
} else {
pais = paises[indexPath.row]
}
cell.textLabel?.text = pais.nome + " (+" + String(pais.codigo) + ")"
if pais.nome != pais.nomeIngles {
cell.detailTextLabel?.text = pais.nomeIngles
} else {
cell.detailTextLabel?.text = ""
}
return cell
}
//MARK: - Métodos do UISearchResultsUpdating
func updateSearchResultsForSearchController(searchController: UISearchController) {
//paisesFiltrado.removeAll(keepCapacity: false)
filtrarBusca(controladorDeBusca.searchBar.text!)
}
//MARK: - Métodos
func carregaDadosPaises() {
//Carrega dados dos países
let pais1 = PaisCodigo(nome: "Brasil", nomeIngles: "Brazil", codigo: 55)
let pais2 = PaisCodigo(nome: "United States", nomeIngles: "United States", codigo: 1)
let pais3 = PaisCodigo(nome: "Argentina", nomeIngles: "Argentina", codigo: 54)
let pais4 = PaisCodigo(nome: "Australia", nomeIngles: "Australia", codigo: 61)
paises += [pais1, pais2, pais3, pais4]
//paisesTableView.reloadData()
}
func configurarControladorDeBusca() {
//Configura Controlador de Busca
controladorDeBusca = UISearchController(searchResultsController: nil)
controladorDeBusca.searchResultsUpdater = self
controladorDeBusca.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
controladorDeBusca.loadViewIfNeeded()
//Configura a barra do Controlador de busca
controladorDeBusca.searchBar.placeholder = "Search country"
controladorDeBusca.searchBar.sizeToFit()
controladorDeBusca.searchBar.barTintColor = navigationController?.navigationBar.barTintColor
//controladorDeBusca.searchBar.translucent = true
controladorDeBusca.searchBar.tintColor = UIColor.whiteColor()
//Adiciona a barra do Controlador de Busca a Table View
paisesTableView.tableHeaderView = controladorDeBusca.searchBar
}
func configurarIndicadorDeAtividade() {
container.frame = paisesTableView.frame
container.center = paisesTableView.center
container.backgroundColor = UIColorFromHex(0xffffff, alpha: 0.2)
loadingView.frame = CGRectMake(0, 0, 80, 80)
loadingView.center = container.center
loadingView.backgroundColor = UIColorFromHex(0x444444, alpha: 0.4)
loadingView.clipsToBounds = true
loadingView.layer.cornerRadius = 10
//Configura Indicador de atividade
indicadorDeAtividade = UIActivityIndicatorView()
indicadorDeAtividade.center = loadingView.center
indicadorDeAtividade.hidesWhenStopped = true
indicadorDeAtividade.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.WhiteLarge
indicadorDeAtividade.tintColor = UIColor.redColor()
//Adiciona o indicador a View
container.addSubview(loadingView)
loadingView.addSubview(indicadorDeAtividade)
view.addSubview(container)
indicadorDeAtividade.hidden = false
}
func iniciaIndicadorDeAtividade() {
indicadorDeAtividade.startAnimating()
}
func paraIndicadorDeAtividade() {
}
func configuraComportamentoDaTabela() {
paisesTableView.hidden = !indicadorDeAtividade.hidden
paisesTableView.userInteractionEnabled = !paisesTableView.hidden
}
func filtrarBusca(textoDeBusca: String) {
//Filtrar resultados de busca
paisesFiltrado = paises.filter{ PaisCodigo in
return PaisCodigo.nome.lowercaseString.containsString(textoDeBusca.lowercaseString) || PaisCodigo.nomeIngles.lowercaseString.containsString(textoDeBusca.lowercaseString)
}
paisesTableView.reloadData()
}
func UIColorFromHex(rgbValue:UInt32, alpha:Double=1.0)->UIColor {
//Conversor de cores em HEX
let red = CGFloat((rgbValue & 0xFF0000) >> 16)/256.0
let green = CGFloat((rgbValue & 0xFF00) >> 8)/256.0
let blue = CGFloat(rgbValue & 0xFF)/256.0
return UIColor(red:red, green:green, blue:blue, alpha:CGFloat(alpha))
}
Activity indicator
over the loading view? I triedloadingView.insertSubview(indicadorDeAtividade, aboveSubview: loadingView)
but it didn't work. – GuiDupas