1
resposta

Desafio colocar botão de cancelar e tela de emptyState

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
    }
1 resposta

Oi Pedro! Tudo bem?

Você se dedicou mesmo a esse desafio! Parabéns pelo ótimo trabalho, continue assim e só irá crescer em aprendizados!

Conte com o apoio do Fórum na sua jornada :)

Abraços e bons estudos!