Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Erro no SearchBar

Estou iniciando a implementacao do SearchBar. Quando comeco a digitar nele, o app quebra, abrindo a classe AppDelegate e no console aparece a seguinte mensagem:

libc++abi.dylib: terminating with uncaught exception of type NSException

Colocando breakpoints, o problema ocorre na execucao da linha:

let listaFiltrada:Array<Viagem> = (listaViagens as NSArray).filtered(using: filtroListaViagem) as! Array

Nao consegui descobrir o erro...

8 respostas

Olá Vanessa, tudo bem?

Poderia colar aqui a implementação do método:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

Oi, Andriu!

Segue o ponto onde parei....

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        let filtroListaViagem = NSPredicate(format: "titulo contains %@", searchText)
        let listaFiltrada:Array<Viagem> = (listaViagens as NSArray).filtered(using: filtroListaViagem) as! Array
        listaViagens = listaFiltrada
        colecaoPacotesViagem.reloadData()
    }

Oi Vanessa,

Então, colei exatamente o seu código no meu projeto e funcionou \O/

Confere se o atributo 'titulo' da classe 'viagem' está escrito igual no predicate.

Consegue subir seu projeto no github ou mandar o zip para mim dar uma olhada?

Posso mandar o zipado... qual o email?

pode sim

Enviei. Obrigada, Andriu.

solução!

Oi Vanessa,

Aparentemente o problema é com o formato do Predicate que por algum motivo não está reconhecendo o atributo 'titulo' da classe Viagem.

Uma boa solução é utilizar os novos métodos da API de Array do Swift como por exemplo o método filter.

Ficaria algo assim:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        listaViagens = listaComTodasViagens
        if searchText != "" {
            listaViagens = listaViagens.filter { $0.titulo.contains(searchText) }
        }
        colecaoPacotesViagem.reloadData()
    }

Com esse método descartamos o uso do predicate, já que dentro dele estamos verificando se o que digitamos no search contém dentro de algum objeto do array.

Espero ter ajudado ;]

Com essa novo método funcionou! Obrigada, Andriu.