指标 activity 未显示
Indicator activity not showing
我有一个代码可以在 Swift 中显示 activity indicator
,但它无法正常工作。
即使 configuration func
中的所有代码都已正确加载,activity indicator
也不会出现。
代码中出了什么问题?
这是代码和图片:
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))
}
您的indicadorDeAtividade.center
不正确。 UIView
的 center
属性 使用父视图的坐标系,因此您已将 activity 指示器放置在屏幕外。
在函数configurarIndicadorDeAtividade
中,替换:
indicadorDeAtividade.center = loadingView.center
与:
indicadorDeAtividade.center = CGPointMake(loadingView.frame.width / 2, loadingView.frame.height / 2)
我有一个代码可以在 Swift 中显示 activity indicator
,但它无法正常工作。
即使 configuration func
中的所有代码都已正确加载,activity indicator
也不会出现。
代码中出了什么问题?
这是代码和图片:
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))
}
您的indicadorDeAtividade.center
不正确。 UIView
的 center
属性 使用父视图的坐标系,因此您已将 activity 指示器放置在屏幕外。
在函数configurarIndicadorDeAtividade
中,替换:
indicadorDeAtividade.center = loadingView.center
与:
indicadorDeAtividade.center = CGPointMake(loadingView.frame.width / 2, loadingView.frame.height / 2)