Swift - Indicator activity is not showing up

0

I have code to show activity indicator in Swift, but it is not working properly. activity indicator does not appear, even after all code within func de configuração is loaded correctly.

What's wrong?

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))
    }

    
asked by anonymous 19.04.2016 / 21:20

1 answer

1

The indicadorDeAtividade.center is incorrect. The center property of a UIView uses the superview coordinate system, so activity indicator is off the screen.

Replacing indicadorDeAtividade.center = loadingView.center with% with% activity indicator is in the correct position.

    
19.04.2016 / 22:58