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

App crasheia ao aplicar o filtro na lista deu pacotes

Pessoal, boa noite!

Implementei o método:

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

        listaViagens = listaComTodasViagens

        if (searchText != "") {
            let filtroListaViagem = NSPredicate(format: "titulo contains %@", searchText)
            let listaFiltrada:Array<Viagem> = (listaViagens as NSArray).filtered(using: filtroListaViagem) as! Array
            listaViagens = listaFiltrada
        }

        pacotesCollectionView.reloadData()
    }

e a app crasheia na linha:

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

Alguém sabe me explicar o por quê?

3 respostas

Oi Rodrigo, como vai?

A sintaxe do seu código está correta.

Eu precisaria dar uma olhada no resto do projeto para identificar o problema. Caso queira subir no git e me enviar o link eu posso dar uma olhada.

Ou você pode alterar a implementação utilizando o método filter do Array do Swift. Ficaria algo assim:

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

O método filter itera cada objeto dentro do array e verifica se o atributo título contem o texto do search.

Tenta implementar, caso não funcione me avisa aqui no fórum novamente.

Código no git : https://github.com/rodrigo-luiz-duarte/curso-ios-layout.git

solução!

Oi Rodrigo,

O problema é o seguinte, quando esse curso foi gravado foi utilizado a versão 3.2 do Swift:

versão do Swift 3.2

Ao baixar o seu projeto, percebi que você está utilizando a versão 4.0:

versão 4.0 do swift

A partir dessa versão, para utilizar APIs do objective C (antiga linguagem da Apple) precisamos utilizar a anotação @objc.

Como estamos fazendo o casting de Array para NSArray (objective C) para utilizar o método filter e passar o predicate, precisamos colocar essa anotação no atributo da classe que vamos filtrar.

Resumindo, para solucionar você precisa incluir essa anotação:

adicionando @objc no atributo titulo

Espero ter ajudado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software