Swift - Indicator Activity not showing

Asked

Viewed 66 times

0

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

What is wrong?

Here’s 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))
    }

enter image description here

1 answer

1


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

Replacing indicadorDeAtividade.center = loadingView.center for indicadorDeAtividade.center = CGPointMake(loadingView.frame.width / 2, loadingView.frame.height / 2) the activity indicator is in the correct position.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.