Primeiras aulas do curso IOS parte 2: Autenticação, GPS e mais recursos nativos

IOS parte 2: Autenticação, GPS e mais recursos nativos

Implementando mais recursos no app - Introdução

Olá, tudo bem? Bem vindos a segunda parte do curso de Recursos Nativos para iOS. Caso você ainda não tenha feito a primeira parte, eu recomendo que você faça, para seguirmos a partir daqui com tranquilidade.

Nesse curso nós vamos continuar a implementação da agenda, mas explorando vários outros frameworks do iOS para implementarmos no nosso projeto. O primeiro que vamos ver é o de autenticação local.

Sabe aquela tela de desbloqueio que tem do iPhone, que nós precisamos colocar a biometria? Vamos utilizar esse recurso para impedir que qualquer usuário apague os nossos alunos. Esse é o primeiro que nós vamos ver.

Depois vamos seguir com a implementação, aprendendo como fazemos algumas customizações no mapa. Então vou abrir aqui o mapa, você vai perceber que nós fizemos uma customização no pino do mapa, olha que legal ficou o pino da Caelum, ele ficou preto e com o ícone.

E também vamos aprender a mostrar todos os pinos possíveis na mesma visualização. Repara que quando eu abri a funcionalidade, ele abriu com os dois pinos, que é o pino da minha localização central, que é a Caelum, e o pino onde está cadastrada a aluna Adriana. Também vamos aprender a usar o GPS, eu consigo exibir aqui a minha localização atual, através desse botão que nós vamos aprender a criar.

Seguindo, vamos aprender também ao fazer atalhos no nosso app. Como assim atalhos? Sabe aquele recurso quando fazemos um pouco mais de força em cima de um ícone aqui na tela principal do iPhone? Vou fazer aqui um force touch, ele abre algumas opções para nós. Se você é usuário de iOS, provavelmente você já viu esse recurso em outros aplicativos. Eu consigo abrir uma feature rapidamente através desse shortcut.

Também vamos aprender a abrir páginas web. Repara que no formulário da Adriana está o site da Alura. Então se fizermos um long press aqui, eu consigo abrir uma página web a partir do meu app, nós conseguimos acessar a página que está no cadastro do aluno.

E para finalizar, , vamos aprender a setar o ícone no nosso aplicativo, olha que legal ficou o ícone da nossa agenda, vamos estudar quais são as guide lines, o que temos que nos atentar na hora que formos criar um ícone e também um site bem legal para exportarmos uma imagem para todos os tamanhos que nós precisamos para setar no nosso aplicativo. Meu nome é Ândriu, eu sou instrutor desse curso e vamos continuar?

Implementando mais recursos no app - Autenticação local

Tudo bem? Vamos continuar o nosso projeto? A agenda que nós estamos desenvolvendo pode ser utilizada para automatizar diversos processos em uma escola, como por exemplo, ao invés do funcionário preencher manualmente o formulário de cadastro de alunos ou ter que tirar foto 3x4, colar no formulário e guardar isso numa gaveta cheia de papéis, nós podemos fazer isso rapidamente através do nosso app.

Nós já conseguimos fazer ligação telefônica, localizar o endereço do aluno no mapa, enviar alguma informação relevante da escola pro aluno através de SMS, também conseguimos traçar uma rota da onde estamos até o endereço do aluno. Então tem várias features que nós já implementamos. Porém, tudo isso só faz sentido se tivermos o cadastro dos alunos.

Como o nosso app pode ser utilizado por qualquer colaborador dentro de uma escola, para gerenciar esses alunos, imagine o risco se todo mundo apagar um aluno sem querer ou intencionalmente mesmo. Então eu trabalho em uma escola e de repente faço isso daqui no cadastro do João, clico em deletar. O que aconteceu? Já era todas as informações que nós tínhamos do João, então nós não vamos saber quem apagou, simplesmente vai sumir esse cadastro.

E isso é péssimo para o nosso app, porque não tem segurança nenhuma, qualquer pessoa pode ir lá e apagar os alunos. Então agora vamos aprender como nós trabalhamos com autenticação local aqui no iOS.

Por exemplo, antes de eu apagar um aluno, eu posso pedir a senha do iOS ou a biometria do usuário, então somente usuários cadastrados e autorizados vão conseguir apagar esses alunos. Então vamos começar?

O primeiro passo, nós vamos criar uma nova classe, que vai se chamar autenticação local. Então aqui na pastinha “Componentes” eu vou clicar com o botão direito, novo arquivo e eu vou dar um next. Aqui ele tem que ser subclasse de NSOject mesmo, porque é uma classe que nós vamos criar e eu vou chamar de “AutenticacaoLocal”. Vou dar um next e depois disso eu vou dar um create.

Com a classe criada, nós já podemos criar o nosso método, então vou chamar aqui “func autorizaUsuario()”. Para trabalharmos com essa autenticação aqui no iOS, precisamos utilizar uma classe que se chama LAContext, LA de local authentication. Vamos criar uma constante desse tipo para começarmos a trabalhar com essa classe? “let”, vou chamar de “contexto” e ele vai ser do tipo “LAContext()”, e vou instanciar essa classe.

Só que ele vai dar um erro, porque nós não temos acesso a essa classe. Isso acontece porque ela não faz parte do “UIKit”, que é o framework padrão que nós sempre utilizamos, nem do [FOUNDATION], então não temos acesso a essa classe. Para conseguirmos ter acesso, precisamos importar, então aqui eu vou dar um “import” e vou chamar o “LocalAuthentication”. Agora sim podemos começar a trabalhar com ela.

O primeiro passo é verificarmos a disponibilidade desse recurso no iOS. Assim como fizemos com a câmera na primeira parte desse curso, onde tivemos que verificar se era possível utilizar a câmera, aqui nós vamos fazer a mesma, vamos verificar a disponibilidade desse recurso. Vou chamar aqui o “contexto”, vou chamar esse método “canEvaluatePolicy” e vou dar um enter.

Aqui ele vai me pedir dois parâmetros. O primeiro é o tipo de autenticação que nós queremos fazer, então vou colocar aqui um “.”, ele é um enum com duas opções. A primeira opção é a biometria ou o usuário pode digitar a senha que está cadastrada no iOS. E a segunda opção é apenas a biometria, então o cara só consegue fazer qualquer operação se ele estiver com a biometria cadastrada no device.

Isso depende da regra de negócio do app que você estiver implementando. No nosso caso eu vou escolher a primeira opção mesmo, eu quero a biometria ou a senha numérica, então os dois vão dar certo.

E aqui ele pede um error, então vamos criar aqui uma variável “var error” do tipo “NSError”, e eu vou passá-la aqui, então vou colocar um “&” e vou passar o “error”. E tudo isso dentro do “if”. Ele vai verificar essa disponibilidade do recurso para nós. Se ele entrar no “if” significa que nós já podemos continuar com as implementações.

Agora o que nós precisamos fazer? Precisamos efetivamente chamar o método que vamos utilizar para autenticar, então vou chamar o nosso “contexto.evaluatePolicy. Então aqui novamente eu passo qual opção do enum que eu quero, como nós escolhemos essa primeira, aqui nós vamos colocar a mesma.

O segundo parâmetro é uma string, onde vamos exibir uma mensagem para o usuário, falando o porquê que nós precisamos da autenticação dele para fazer determinada tarefa no nosso app. No nosso caso, por que nós precisamos que o cara coloque a biometria? Para apagar um aluno. Então temos que colocar isso aqui, vamos explicar para o usuário, “é necessário autenticação para apagar um aluno”.

E aqui ele nos traz duas variáveis através de uma [ININTELIGÍVEL], uma que vai ser a “resposta” e a outra que vai ser um “erro”, caso ocorra algum problema. Essa é a implementação que nós precisamos para autenticar um usuário.

Só que aqui ele retorna uma variável booleana, verdadeira ou falsa, ou seja, se o cara colocou a biometria dele e está cadastrada no iOS, legal, nós conseguimos apagar o aluno. Só que se ele colocar a biometria dele e não estiver cadastrado, nós não podemos apagar o aluno. Então onde nós apagamos o aluno efetivamente? É na tabela de alunos, ou seja, no View Controller “HomeTableViewController”. Então vamos achar a parte do código onde apagamos um aluno?

É junto com os métodos da Table View, então está por aqui. É esse método aqui, “commit editingStyle”. Repara que aqui tem o “if”, verificando se o cara clicou no “Delete” no swype, e se clicou, nós executamos essa parte de código, que é onde apagamos o aluno.

Só que antes de apagarmos, precisamos ter acesso a essa variável booleana que a nossa classe de autenticação nos devolve. Como nós fazemos para ter acesso a essa variável no View Controller? Nós podemos criar uma closer aqui no nosso método.

Na assinatura do método eu vou criar um bloco de completion, então vou colocar aqui “completion” e agora nós passamos a variável que nós temos como resposta, então vou colocar “autenticado”, que é do tipo booleano. E agora podemos chamar esse método na nossa classe do HomeTableViewController. Vamos fazer isso?

Vou vir para cá e agora vamos fazer o seguinte, antes de deletarmos, eu vou chamar esse “AutenticacaoLocal().autorizaUsuario”. Então aqui ele vai me trazer o bloco de completion que nós criamos e a variável booleana. Qual nome nós podemos pôr para ela? Vamos pôr, por exemplo, “autenticado”, então ele pode ter o valor de verdadeiro ou falso.

Aqui nós fazemos a verificação, se a variável “autenticado” for verdadeira, nós apagamos o usuário, ou seja, se ela for verdadeira significa que a biometria do nosso usuário ou a senha numérica que ele colocou está correta.

Só que como nós colocamos tudo isso dentro de uma closer que nós criamos, nós precisamos passar o “self” na referência dessas variáveis. Então “self”, aqui onde chamamos o contexto também, “self”, aqui no “do” nós vamos passar o “self”. Então já temos a implementação.

Para tudo isso funcionar nós temos que chamar o nosso completion, então vou chamar aqui o “completion” e vou passar a variável que ele está dando como resposta, qual é a variável? Essa aqui, então vou passar a “resposta”. Com essa implementação nós já podemos testar isso no nosso device. Vamos fazer isso? Eu estou já com meu iPhone plugado no Mac e vou rodar o app para testarmos. Então vamos dar uma olhada.

Estou com o aplicativo rodando no meu iPhone e agora nós vamos testar. Vou fazer um swype no primeiro aluno que eu quero apagar, que vai ser no Henrique, e vou clicar em “Delete”. Olha que legal, já apareceu esse popover para nós, pedindo o nosso touch ID, que é a nossa biometria. Ele fala assim: “é necessário autenticação para apagar um aluno”, que é a mensagem que nós colocamos na hora que estávamos utilizando o nosso contexto.

Primeiro eu vou colocar um dedo que não está cadastrado, vou colocar qualquer dedo aqui, ele não deixa apagar. Ou então o que eu posso fazer? Eu posso clicar para inserir a minha senha numérica. Cliquei aqui, eu posso digitar a minha senha. Vou digitar também uma senha incorreta, então ele não deixou. Agora sim eu vou colocar a minha biometria, para que consigamos apagar. Vou colocar aqui, aí ele vai fazer o processo e vai apagar o aluno para nós. Com isso nós conseguimos melhorar a segurança do nosso app.

Repara, que quando nós apagamos o aluno, olha só o que apareceu para nós, um ícone roxo. Estranho esse ícone. Vamos dar uma olhada para ver o que é? Vou subir nessa classe, no View Controller, e ele está dando uma mensagem nessa parte do contexto, vamos ver o que ele está falando. Vou clicar aqui. Ele está falando o seguinte, “UIApplication.delegate” deve ser utilizada somente na thread principal. Como nós fazemos para saber qual thread o nosso código está sendo executado?

Eu vou fazer o seguinte, eu vou colocar um breakpoint nessa parte e vou apagar novamente outro aluno, para vermos o que está acontecendo. Vou fazer um swype aqui no João, clicar no “Delete” e vou colocar a minha digital.

Repara que ele caiu no breakpoint, esse pontinho aqui serve para parar em determinada parte do código. Então ele parou nessa parte, onde ele chama o contexto, e nesse ícone aqui em cima, do debug, nós conseguimos ver qual é a thread que o nosso código está sendo executado. Ele está na thread 25, onde ele passa pela nossa closer e tudo mais.

Só que aqui ele fala que ele deve estar na thread principal, que é a primeira thread, onde tem esse “main”, então é aqui que ele deve ser executado. Então tem alguma coisa errada. O que pode acontecer se nós não fizemos essa implementação para acertar essa thread? Porque está funcionando, teoricamente está funcionando.

Só que se nós clicarmos no ponto de interrogação, ele traz algumas informações úteis para nós. Ele fala que se nós não mexermos, se não deixarmos na thread principal, podemos ter resultados ruins com a UI do app, atualização, efeitos visuais ou pode ter dados corrompidos e até dar crash no nosso app, imagine o nosso app fechar na cara do usuário? Provavelmente vamos perder o usuário, então precisamos tratar isso.

Nós já vimos que está na thread errada, ele precisa estar na primeira thread, então como nós fazemos para tratar isso? No Swift nós temos um framework que se chama dispatch, que faz parte lá do GCD, Grand Central Dispatch.

Esse dispatch é realmente despachar uma parte de código para uma determinada fila, que é o que nós precisamos fazer, precisamos despachar esse código do contexto para thread principal, que é o que ele está mostrando para nós. Então vamos mexer nisso.

Qual é a parte que nós apagamos o aluno? É naquele “commiteditingStyle”, então aqui eu faço a verificação para ver se ele está autenticado e se estiver, ele começa a trabalhar com o contexto. Então nessa parte nós precisamos chamar o dispatch, para ele despachar o nosso código para thread principal. Como nós fazemos isso?

Eu vou digitar aqui “DispatchQueue.main.”, e ele me dá essa opção “async”, com esse “code”, eu vou selecionar essa opção. E agora eu vou colocar toda essa parte dentro do “Dispatch”, então eu vou recortar e vou colá-la aqui, colei. Então teoricamente nós estamos despachando o nosso código para thread principal. Vamos testar para ver se está ok? Vou buildar de novo aqui no iPhone.

Vamos testar? Tenho dois alunos aqui, eu vou apagar o Andriu, que é o primeiro, dar um “Delete” e vou colocar a minha biometria novamente. Apagou. Já estava pagando, agora o que nós precisamos saber é se sumiu a mensagem, não está mais aparecendo aquele warning para nós, na variável de contexto. Então o dispatch que nós fizemos, teoricamente, está funcionando.

para ter certeza realmente se está na thread principal, eu vou fazer o seguinte, vou colocar outro breakpoint aqui e vou chamar novamente o método de deletar, então vou fazer um swype aqui, clicar em “Delete” e vou colocar a minha digital. Caiu no nosso breakpoint.

Agora, em qual thread ele está? Ele está na primeira thread, na thread principal, então realmente nós resolvemos o problema. Vou passar aqui para sair do breakpoint, vou tirar aqui e ele deve apagar o aluno.

Com isso, nós arrumamos a thread, que ele deu uma mensagem falando que estava meio estranho, nós usamos o dispatch e também melhoramos a segurança na hora de deletar o aluno no nosso aplicativo, somente pessoas autorizadas, com a digital cadastrada no iOS ou com a senha numérica vão conseguir deletar o aluno.

Implementando mais recursos no app - Filtrando alunos

De volta ao projeto, essa agenda que nós estamos desenvolvendo pode ser utilizada em uma escola que tenha 500, 1000, 1500 alunos. Imagine o trabalho que não daria para encontrar esses alunos? Nós teríamos que fazer um scroll quase que infinito para conseguirmos encontrar um aluno que precisemos verificar algum dado.

O mais comum nesse tipo de aplicativo é o uso do search, que é uma barrinha onde nós pesquisamos, digitamos o nome do aluno e encontramos com facilidade, que é o que já temos aqui, o componente visual. Se eu fizer um scroll para baixo na Table View, aparece esse “Search”.

Se eu clicar aqui, deixa eu só habilitar o teclado do iOS, vou vir em Hardware, Keyboard e vou selecionar essa última opção. Se eu digitar, por exemplo, “Caroline”, e clicar no “Search”, eu ainda não estou fazendo nada, porque só está implementada a parte visual. Então agora é hora de melhorarmos essa pesquisa por alunos no nosso aplicativo. Vamos começar?

O primeiro passo é identificarmos em que momento que nós queremos fazer essa pesquisa. Eu estou aqui digitando o nome do meu aluno e clico no botão “Search”. Então quando eu clicar no botão “Search” eu vou ter que começar a fazer alguma coisa para filtrar.

para termos acesso a esse evento do clique do botão search, nós precisamos utilizar um protocolo do Search Bar, que já tem, inclusive, aqui no nosso View Controller, que é esse, “UISearchBarDelegate”. Através desse protocolo, ele nos traz vários métodos que conseguimos capturar os momentos que precisamos para implementar o nosso código.

Aqui no final do View Controller eu vou implementar esse método, deixa eu só dar alguns espaços para melhorar a visualização. Eu vou colocar aqui mais um marcador, para deixar organizado e vou colocar “SearchBarDelegate”.

Esses marcadores que nós colocamos aqui no código é só por questão de organização, então, por exemplo, se eu quiser verificar quais são os meus métodos, eu posso clicar aqui e ele abre todos esses marks que nós colocamos. Então quero ver os meus métodos, vou clicar aqui, ele me traz para esse mark. Mas eu quero ver qual é o método do search, eu clico aqui e vou no search, ele me traz para esse marcador. É só questão de organização mesmo.

Como o protocolo já está implantado no nosso View Controller, eu já posso utilizar o método. Eu vou começar a digitar o “search” e ele me traz uma série de métodos que nós podemos utilizar. O que nós precisamos é quando o usuário clica no botão “Search”, que é exatamente esse primeiro, então eu vou utilizá-lo. Já tenho acesso ao evento do botão do search.

Próximo passo é eu capturar o que o usuário digitou. Como eu faço isso? Repara que eu tenho como parâmetro esse “SearchBar”, então eu posso utilizá-lo. Vou começar a digitar aqui “searchBar”, se eu der um “.text” repara que ele me traz uma string, que é exatamente o texto que digitamos lá no search. Só que essa string é optional.

Para melhorar isso, podemos criar um “guard let”, assim extraímos esse valor desse search bar. Vou criar aqui um “guard let nomeDoAluno = searchBar.text”. Se eu não conseguir extrair esse valor, eu dou um “return”. Então já tem duas coisas importantes que nós já estamos trazendo, já estamos conseguindo capturar o evento desse botão “Search” e já estamos conseguindo capturar o que o usuário digitou aqui na barra de pesquisa.

O próximo passo é efetivamente fazermos essa filtragem. Para filtrarmos os objetos que estão em memória aqui no Swift, podemos utilizar uma classe que se chama NSPredicate, onde nós passamos para ele qual atributo que nós queremos filtrar e ele vai verificar se esse atributo contém na lista que nós temos. Então vamos fazer isso?

Eu vou criar aqui um método para conseguirmos fazer esse Predicate. Então embaixo de “recuperaAluno” eu vou criar um novo método “filtraAluno()” e eu vou devolver um “NSPredicate”. Aqui eu vou precisar saber o que o usuário digitou, então eu vou pedir como parâmetro o “filtro”, ou seja, o nome do aluno, e aqui eu posso dar um “return”. Só que como eles espera um NSPredicate, eu tenho que criá-lo, então “NSPredicate”, vou inicializá-lo.

Repara que tem várias inicializações, a que nós precisamos é essa primeira, onde eu passo um formato e um argumento, então eu vou selecioná-la. Aqui ele espera uma string, então vou abrir uma string e o que eu coloco aqui?

Primeiro nós precisamos entender qual é o atributo que nós precisamos filtrar. Se eu abrir o [ININTELIGÍVEL] do Core Data, nós temos a entidade “Aluno” que nós criamos e temos vários atributos, temos o “endereco”, a “foto”, o “nome”, a “nota”, o “site”, o “telefone”, tem vários atributos. Qual deles é o melhor para utilizarmos para fazer essa filtragem? Vamos dar uma olhada aqui.

Eu digitei, por exemplo, “Caroline”. Eu digitei o nome do aluno, então seria uma boa nós utilizarmos o atributo “nome”, então vamos utilizá-lo para fazer essa filtragem. Vou voltar aqui e vou colocar “nome”.

Depois disso precisamos colocar uma palavra-chave que é essa daqui, “CONTAINS”, então vamos verificar se o nome que digitamos contém no array de alunos que nós vamos verificar, e aqui eu passo, concatenando, o “filtro”, que é o nome do aluno. Então já tenho um Predicate que nós podemos utilizar para fazer a filtragem.

Mas aonde que eu vou utilizá-lo? Repara que temos um método que nós utilizamos logo quando inicializamos essa tela, onde listamos todos os alunos na Table View. Nesse método nós podemos passar como argumento algumas configurações como, por exemplo, nós criamos aqui uma constante para ordenar os alunos por nome, então tem algumas configurações que nós podemos passar, inclusive um Predicate.

Nessa constante que é esse “NSFetchRequest”, ele aceita um Predicate, então eu vou chamar esse “pesquisaAluno.predicate” e eu posso fazer o seguinte, posso chamar o nosso método “filtraAluno”.

Só que aqui eu tenho que passar o que o usuário digitou. Só que eu não tenho acesso a isso, dentro desse escopo, desse método. Então como eu peço esse acesso? Eu vou ter que pedir aqui na assinatura do método. Então aqui vou colocar “filtro”, que é do tipo “String”.

Só que quando eu vou chamar esse método? Eu vou chamar quando o usuário clicar no search, que é esse método de delegate que nós implementamos aqui. Aqui eu posso chamar o “recuperaAluno” passando o nome do aluno que nós utilizamos, então vou colocar aqui “nomeDoAluno”. E depois disso eu faço um reload na Table View, para mostrar os dados atualizados.

Só que como nós alteramos a assinatura do método “recuperaAluno”, ele vai dar um errinho, porque nós estamos utilizando-o no viewDidLoad, então se eu subir aqui, repara que nós não precisamos passar nenhum filtro, porque nós queremos carregar a tela pela primeira vez, então eu quero realmente todos os alunos, eu não quero filtrar nada nesse momento.

Para resolver esse problema, podemos fazer o seguinte, na assinatura do método eu posso colocar um “=” e abrir uma string, ou seja, se eu não passar nada, ele assume que está vazio, então já resolve esse problema. Inclusive, se eu chamar esse método “recuperaAluno”, ele tem duas inicializações, uma onde eu posso passar vazio e a outra onde eu passo o filtro, que é realmente o que nós precisamos. Agora que já temos acesso ao filtro, é só eu o passar aqui, então vou passar o “filtro”.

Só que, pensa só, a primeira vez que eu abri essa tela, faz sentido eu criar esse “predicate”? Eu acho que não. Só faz sentido eu criar esse filtro se o usuário digitou alguma coisa no search. Então precisamos fazer uma verificação. Vou criar outro método, “func verificaFiltro”, onde eu vou receber o “filtro” e vou devolver uma variável booleana, um true ou false, ou seja, posso filtrar ou não vou filtrar.

O que nós vamos fazer aqui? Vamos fazer o seguinte, se o filtro que nós passarmos por parâmetro estiver vazio, ou seja, “isEmpty”, significa que eu não quero filtrar nada, então vou dar um “return false”, não quero filtrar. Caso contrário, eu passo o “true”, ou seja, eu vou filtrar.

Agora eu posso utilizar isso para fazer a verificação. Vamos lá? “if verificaFiltro”, então aqui eu passo meu filtro. Se tiver alguma coisa dentro dessa string eu vou filtrar, caso contrário, ele não vai entrar no “if” e eu vou listar os alunos normalmente. Com essa implementação nós já podemos testar o nosso app. Vamos testar então? Vou rodar o aplicativo.

[09:52] Vamos testar. Vou habilitar o “Search” e vou digitar o nome de uma aluna, “Caroline” e vou dar um “Search”. Nós já estamos conseguindo filtrar os alunos. Só que tem um probleminha, e se quisermos visualizar novamente todos os alunos? Teoricamente eu teria que clicar aqui em “Cancel”, vou clicar em “Cancel” e não aconteceu nada. Então falta mexermos nisso.

O que nós precisamos é ter acesso a ação daquele botão cancelar. Nós já fizemos isso nessa aula, só que tivemos acesso ao botão “Search”. Então podemos utilizar aquele mesmo protocolo. Aqui embaixo eu vou fazer o seguinte, vou começar a digitar “search” e ele vai me dar os métodos, o que eu preciso é esse aqui, “CancelButton”. Vou clicar aqui.

Se ele clicar então no “Cancel”, o que eu vou ter que fazer? Eu vou ter que chamar o método “recuperaAluno” não passando nada como parâmetro, e eu dou um reload na Table View. Vamos testar? Vou rodar o app novamente.

Vou fazer novamente mais uma pesquisa, vou colocar “Caroline” novamente, vou dar um “Search”, filtrou certo. Agora, se eu clicar em “Cancel”, eu vou chamar aquele método do botão cancelar e ele vai fazer a consulta novamente, trazendo todos os alunos. Agora eu consigo visualizar novamente todos os alunos.

O search é uma função muito bacana, quando estamos trabalhando com vários elementos dentro de uma Table View. para não perdermos muito tempo procurando o objeto que queremos visualizar, nós utilizamos o search.

Sobre o curso IOS parte 2: Autenticação, GPS e mais recursos nativos

O curso IOS parte 2: Autenticação, GPS e mais recursos nativos possui 108 minutos de vídeos, em um total de 34 atividades. Gostou? Conheça nossos outros cursos de iOS em Mobile, ou leia nossos artigos de Mobile.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda iOS acessando integralmente esse e outros cursos, comece hoje!

  • 1241 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1241 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1241 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1241 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Procurando planos para empresas?

Acesso por 1 ano

Estude 24h/dia onde e quando quiser

Novos cursos todas as semanas