Para adicionar o botão de cancelar ao lado da barra de pesquisa, existe um método da searchBar
chamado setShowsCancelButton
, com ele é possível controlar se vai aparecer ou não o botão de cancelar adicionando animação
searchBar.setShowsCancelButton(true, animated: true)
Então é possível controlar se vamos mostrar ou não dentro do próprio delegate. Além disso, o delegate tem uma função que controla o que esse botão irá fazer ao ser clicado, chamado searchBarCancelButtonClicked
. Para isso, basta adicionar a regra se o texto do input não for vazio você criar regras necessárias para o comportamento do input.
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
if let searchBarText = searchBar.text {
if !searchBarText.isEmpty {
filteredMovies = movies
isSearchActive = false
searchBar.setShowsCancelButton(false, animated: true)
searchBar.text = ""
}
}
tableView.reloadData()
}
Por último, seria a criação do emptyState para caso não encontre nenhum filme. Isso dei uma pesquisada e a ideia seria você criar uma extension para a UITableView
, criando dentro um método que crie uma UILabel
centralizada setando ela como backgroundView
e uma função responsável por remover essa label do background. Com elas será possível fazer o controle de apresentação dentro da função que controla os números de linhas na seção.
// Extension para criação do label de emptyState
extension UITableView {
func setEmptyMessage(_ message: String) {
let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height))
messageLabel.text = message
messageLabel.textColor = .white
messageLabel.numberOfLines = 0
messageLabel.textAlignment = .center
messageLabel.font = .systemFont(ofSize: 24, weight: .bold)
messageLabel.sizeToFit()
self.backgroundView = messageLabel
self.separatorStyle = .none
}
func restore() {
self.backgroundView = nil
self.separatorStyle = .singleLine
}
}
// ...
// Utilização dentro da função tableView que contém o número de seções.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if isSearchActive && filteredMovies.isEmpty {
tableView.setEmptyMessage("Nenhum filme encontrado!")
}
else {
self.tableView.restore()
}
return isSearchActive ? filteredMovies.count : movies.count
}