Desenvolvimento iOS com Swift2 - iOS avançado

Neste capítulo, vamos cobrir alguns recursos avançados, como criação de múltiplas visualizações em nosso aplicativo, adição de barras de navegação, adição de visualizações de tabela, armazenamento de dados no aplicativo, criação de aplicativos da Web, etc.

Por favor, leia cada seção com cuidado, pois este capítulo contém a maioria das coisas de que precisamos ao desenvolver aplicativos.

Multiple View Controller

Em nossos aplicativos anteriores, fornecemos apenas um único controlador de visualização / visualização. No entanto, podemos ter várias visualizações em nosso aplicativo e podemos executar em qualquer uma delas independentemente.

Portanto, começaremos criando um novo projeto; o nome deste projeto possui múltiplas visualizações. Como qualquer outro projeto, este projeto também possui um Controlador de Visualização e um Arquivo Swift para esse controlador. (Isso você pode ver selecionando visualizar e ver suas propriedades no Inspetor de identidade.)

A captura de tela a seguir mostra a aparência de nossa visão atual -

No lado direito (inspetor de identidade), podemos ver a classe que está relacionada ao nosso controlador de visualização. Esta seta à esquerda é o ponto de entrada. Esta é a primeira visualização de nosso aplicativo que aparecerá depois que o aplicativo começar a ser executado.

Adicionando um segundo controlador de visualização múltipla

Para adicionar outros controladores de visualização à nossa aplicação, pesquisaremos o controlador de visualização em nossa biblioteca de objetos. Assim que o encontrarmos, arrastaremos o controlador de visualização para nosso main.stroryboard, fora de qualquer outra visualização.

Esta é a aparência de seu aplicativo. Agora, adicionamos um controlador de visualização, mas agora também precisaremos criar uma classe de controlador de visualização para nossa visualização recém-adicionada.

Right click on your project → new File → cocoa Touch Class → Nomeie como quiser, vamos chamá-lo de “SecondViewController”.

É assim que você cria um arquivo de classe para seu controlador de visualização. Agora, volte para seu “main.storyboard”, clique em seu segundo controlador de visualização e veja seu Inspetor de identidade.

O campo da classe deve estar vazio agora, então clique nesse campo e comece a digitar o nome da classe que você adicionou na última etapa. Se aparecer, clique em entrar.

Agora criamos um controlador de visualização múltipla e adicionamos o arquivo de classe do controlador para essa visualização. No entanto, se você executar o aplicativo, ele ainda não mostrará sua segunda visualização. Por quê?

Porque não adicionamos uma função, o que nos levará a essa visão. Resumindo, ainda não adicionamos a Navegação ao nosso aplicativo. Não se preocupe; vamos cobrir isso na seção seguinte.

Adicionando navegação ao aplicativo

O processo de transição de uma visão para outra é chamado Segueing, ou seja, feito criando segue entre as duas visualizações. Para fazer isso, adicione um botão no primeiro controlador de visualização e arraste dele para sua segunda visualização. Ao soltar o botão, você verá algumas opções conforme mostrado na imagem abaixo.

Selecione a opção Mostrar no Segmento de ação. Agora execute seu aplicativo, você verá que ao clicar em um botão, aparece sua segunda visualização (para ver mais claramente adicione algo em sua segunda visualização, para que você possa identificar).

No entanto, agora você não pode voltar à sua primeira visão. Para isso, temosNavigation controllers.

Adicionar um controlador de navegação

Selecione seu primeiro controlador de visualização e, na barra superior, clique em Editor → Embed in → Navigation controller.

Agora, nosso aplicativo deve ser semelhante à imagem a seguir.

Devemos providenciar para que haja uma pequena fileira cinza claro no topo da vista. Agora, ao executarmos o aplicativo, podemos ver que há uma barra de navegação no topo da visualização. Ao clicar no botão, iremos para a segunda vista, onde veremos um botão voltar nessa barra de navegação. Clique aqui e voltaremos para a Visualização Inicial.

Adicionando Título e Botão Voltar à Barra de Navegação

Para adicionar um título à sua barra de navegação, clique na barra de navegação e veja seu inspetor de atributos. Lá veremos -

  • Title - Este será o título da barra de navegação, que aparece no centro.

  • Prompt - Isso aparece no topo da barra de título, no centro.

  • Back Button - Aqui você pode modificar o Texto que aparece no botão Voltar.

Atualmente o botão que está passando pela visualização está localizado em nossa visualização, o que pode não servir se quisermos que algo mais apareça na tela. Portanto, adicionaremos um item do Botão da barra na barra de navegação, que nos levará à nossa segunda visualização. No entanto, para isso devemos primeiro excluir o último botão que adicionamos.

Adicionando um Item do Botão da Barra

Pesquise o item do botão da barra na biblioteca de objetos e arraste e solte para o lado direito da barra de navegação. Nomeie-o como - “Próximo>”, controle e arraste dele para a segunda visualização, selecione Mostrar como fizemos com o último botão que adicionamos.

Agora execute o aplicativo, ele ficará mais limpo e melhor. Isso é tudo o que faremos com a navegação agora. Nos capítulos subsequentes, vamos modificar a barra de navegação usando o Código Swift, quando necessário.

Vistas de mesa

Uma tabela apresenta os dados como uma lista de coluna única contendo várias linhas, que podem ser divididas em seções. As tabelas devem ser usadas para apresentar os dados de forma limpa e eficiente.

Nesta seção, entenderemos como adicionar visualizações de tabela, adicionando células de protótipo, adicionando fonte de dados e delegados para uma visualização de tabela, alterando propriedades de uma tabela e configurando dados dinâmicos para células de visualização de tabela.

Adicionando uma Visualização de Tabela

Para adicionar uma visualização de tabela, primeiro criaremos um novo projeto e o nomearemos como - “tableView”. Em seguida, vá para a biblioteca de objetos e procure por Table View, veremos a table view, o controlador de table view e muitas outras opções. No entanto, devemos selecionar a visualização da tabela, arrastá-la e adicioná-la ao controlador de visualização padrão.

Adicionando uma célula protótipo

Estique a visualização da mesa para que ela cubra a visualização completa, enquanto a visualização da mesa é destacada. Verifique seu inspetor de atributos, há um campo chamado células de protótipo, que atualmente é 0. Devemos alterar seu valor para 1, agora sua visualização deve ser a seguinte -

Alterando o identificador de célula

Agora, dentro da sua visualização, clique na célula do protótipo (o que é um pouco complicado). Portanto, no contorno do documento, clique em Exibir controlador → Exibir → Exibir tabela → Célula de exibição de tabela, e agora em seu inspetor de atributos há uma coluna chamada Identificador, clique nela e nomeie como “Célula”. Veja as capturas de tela a seguir para entender as etapas acima.

Adicionar delegado e fonte de dados

Para tornar nossas visualizações de tabela dinâmicas, precisamos que carreguem dados dinâmicos. Portanto, precisamos de um delegado e uma fonte de dados para isso. Para tornar delegado e fonte de dados de sua tabela, controle o arrasto da visualização da tabela para o controlador de visualização ou o botão amarelo na parte superior do controlador de visualização, conforme mostrado na captura de tela abaixo.

Quando soltarmos o cursor, veremos duas opções lá, dataSource e delegate, selecione-as uma por uma (quando você selecionar qualquer uma das opções, o pop-up ficará oculto, você precisará repetir a etapa acima para adicionar uma segunda opção) . Agora deve ser parecido com -

Isso é tudo que faremos com nossa UI / Main.Storyboard, agora. Agora mude para o arquivo “ViewController.swift”. AdicionarUITableViewDelegate, UITableViewDataSource, para seu viewController.swift conforme mostrado abaixo -

No entanto, agora o Xcode mostrará um erro nesta linha.

Isso ocorre porque há alguns métodos em que precisamos usar UITableView

Para ver esses métodos, pressione Command + clique no UITableViewDataSouce, e copie os dois primeiros métodos, tendo “numberOfRowsInSection”, “cellForRowAtIndex” Argumentos e cole-os no ViewController.swift, antes do nosso viewDidLoad ().

Remova esta linha @available(iOS 2.0, *), de ambos os métodos e adicione os colchetes de abertura e fechamento “{}”. Agora, a visualização será a seguinte -

O Xcode deve estar apresentando erro em ambas as funções. No entanto, não se preocupe, pois não adicionamos um tipo de retorno dessas funções.

numberOfRowsInSection- Esta função define o número de linhas que nossa seção conterá. Agora, adicione esta linha ao seu método.

return 1 //This will return only one row.

cellForRowAt - Este método retorna o conteúdo de cada célula, indexPathcontém o índice de cada célula. Vamos criar uma célula e então atribuir algum valor a essa célula e, finalmente, retornar a célula.

Agora, suas funções devem ser as seguintes -

internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
   return 1; 
} 
internal func tableView(_ tableView: UITableView, 
   cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
   let cell = UITableViewCell(style: 
   UITableViewCellStyle.default, reuseIdentifier: "Cell") 
   cell.textLabel?.text = "First Row" 
   return cell 
}

Na primeira linha, estamos criando uma célula com estilo padrão, e reuseIdentifier é o nome da célula protótipo que fizemos.

Cell.textLable?.text - Isso define o texto que deve aparecer como título dessa célula.

Finalmente, retornamos uma célula de lá. Tente executar seu aplicativo agora, ele deve ter a seguinte aparência -

Aplicação de cronograma

Neste aplicativo, continuaremos nosso último projeto, e faremos um aplicativo onde imprimiremos a tabela de 2 (2 ... 10 ... 20).

Portanto, para fazer esta aplicação, basta alterar o arquivo do controlador de visualização do projeto.

Altere as funções conforme mostrado abaixo -

internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
   return 10; 
} 
internal func tableView(_ tableView: UITableView, 
   cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
   let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell") 
}

Agora, execute seu aplicativo. Ele deve ser semelhante ao mostrado abaixo.

Agora, como concluímos as visualizações de tabela e fizemos um aplicativo, aqui está um desafio rápido para resolvermos.

Desafio

Faça um aplicativo, onde imprimiremos a tabela de contagem de qualquer número que o usuário inserir.

Hint- Pegue a entrada, adicione um botão, que ao ser pressionado carregará a tabela com a contagem daquele número. Aqui também precisaremos da seguinte função, que recarregará os dados da tabela.

tableView.reloadData()

Este é um desafio para você, pois cobrimos todos os tópicos sobre este aplicativo, portanto, não forneceremos solução para isso.

Aplicação de cronômetro de ovo

Nesta aplicação, usaremos o conceito de Timer() e Class Constructor, que gerencia o tempo. Forneceremos a você o conceito e a codificação. Você deve fazer a IU você mesmo, pois já discutimos cada Elemento de IU muitas vezes em nossos capítulos anteriores. (Embora iremos fornecer dicas para tudo o que parece bastante novo).

O layout final do aplicativo deve ser semelhante a este -

O que acontece neste aplicativo?

  • O rótulo do título tem um valor inicial 210.

  • Ao clicar no botão play, o valor deve diminuir em um a cada segundo.

  • No clique da pausa, o valor deve parar apenas aí.

  • Ao clicar em -10, o valor deve ser reduzido em 10 e o decréscimo deve continuar.

  • Ao clicar em +10, o valor deve ser aumentado em 10 e a redução deve continuar.

  • Ao clicar em Reset, o valor deve se tornar 210.

  • O valor nunca deve ser inferior a 0.

Conceito

  • Usaremos uma variável da classe Timer () → var timer = Timer ().

  • Vamos definir um valor para esta variável do temporizador que acabamos de criar.

    • timer = Timer.scheduledTimer (timeInterval: 1, target: self, selector: #selector (ViewController.processTimer), userInfo: nil, repeats: true)

    • timeInterval -> é o intervalo de tempo que queremos usar,

    • target -> é o controlador de visualização que deve ser efetuado,

    • seletor -> é o nome da função que usará este temporizador,

    • userInfo -> null e repete, sim, queremos repetir, então será verdade.

Invalidando cronômetro

Para interromper um cronômetro durante a programação, adicionaremos timer.invalidate() função.

Elements we have used -

Navigation bar - Na barra de navegação, adicionamos três itens.

  • Item do botão da barra, um à esquerda e outro à direita.
  • Título denominado - “Our Egg Timer”.

Toolbar - Uma barra de ferramentas aparece na parte inferior da tela de um aplicativo e contém botões para realizar ações relevantes para a visualização atual ou conteúdo dentro dela.

As barras de ferramentas são translúcidas e podem ter uma tonalidade de fundo. Freqüentemente, eles se escondem quando é improvável que as pessoas precisem deles.

Adicionamos uma barra de ferramentas na parte inferior de nossa IU, que possui 5 itens.

  • Três itens de botão da barra, chamados -10, Reset e +10.
  • Dois espaços flexíveis: espaço flexível entre os itens do botão da barra -

Como adicionar um ícone ao item do botão da barra?

Selecione o item do botão da barra. Clique no item do botão da barra, vá para o inspetor de atributos, clique em Selecionar item e escolha o item no menu suspenso que aparece.

Da mesma forma, selecione itens para todos os outros botões e crie uma IU conforme indicado acima. Adicione um rótulo ao centro da Visualização e conecte-o como uma tomada, nomeie como -timeLeftLabel.

Ação para iniciar cronômetro

A seguir está o programa para o cronômetro de início.

@IBAction func startTimerButton(_ sender: Any) { 
   if !timerActive { 
      timerActive = true 
      eggTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: 
      #selector(ViewController.processTimer), userInfo: nil, repeats: true) 
   } 
}

Crie a seguinte função -

func stopTimer() { 
   timerActive = false 
   eggTimer.invalidate() 
}

Ação para função de parada

A seguir está o programa para a função de parada.

@IBAction func pauseTimerButton(_ sender: Any) { 
   stopTimer() 
}

Ação para subtração do tempo

A seguir está o programa para subtrair o tempo.

@IBAction func subtractTime(_ sender: Any) { 
   if timeLeft > 10 { 
      timeLeft = timeLeft - 10 
      timeLeftLabel.text = String(timeLeft) 
   } 
}

Ação para reiniciar o tempo

A seguir está o programa para zerar a hora.

@IBAction func resetTimer(_ sender: Any) { 
   timeLeft = 210 
   timeLeftLabel.text = String(timeLeft) 
}

Ação para addTime

A seguir está o programa para adicionar tempo.

@IBAction func addTime(_ sender: Any) { 
   timeLeft = timeLeft + 10 
   timeLeftLabel.text = String(timeLeft) 
}

Agora, o viewController.swift deve ser semelhante a -

import UIKit 
class ViewController: UIViewController { 
   @IBOutlet weak var timeLeftLabel: UILabel! 
   var eggTimer = Timer()  // Initialize the Timer class. 
   var timerActive = false // Prevents multiple timers from firing. 
   var timeLeft = 210  
   func stopTimer() { 
      timerActive = false 
      eggTimer.invalidate() 
   } 
     
   func processTimer() { 
      if timeLeft <= 0 { 
         stopTimer() 
         return 
      }     
      timeLeft = timeLeft - 1; 
      timeLeftLabel.text = String(timeLeft) 
   } 
    
   @IBAction func startTimerButton(_ sender: Any) { 
      if !timerActive {
         timerActive = true 
         eggTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: 
         #selector(ViewController.processTimer), userInfo: nil, repeats: true) 
      } 
   } 
     
   @IBAction func pauseTimerButton(_ sender: Any) { 
      stopTimer() 
   } 
    
   @IBAction func subtractTime(_ sender: Any) { 
      if timeLeft > 10 { 
         timeLeft = timeLeft - 10 
         timeLeftLabel.text = String(timeLeft) 
      } 
   } 
     
   @IBAction func resetTimer(_ sender: Any) { 
      timeLeft = 210 
      timeLeftLabel.text = String(timeLeft) 
   } 
     
   @IBAction func addTime(_ sender: Any) { 
      timeLeft = timeLeft + 10 
      timeLeftLabel.text = String(timeLeft) 
   } 
     
   override func viewDidLoad() { 
      super.viewDidLoad() 
      // Do any additional setup after loading the view, typically from a nib. 
   }  
   override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated
   } 
}

Isso é tudo o que faremos em nosso aplicativo, tentar executar o aplicativo, ele deve funcionar bem.

Armazenamento de dados no armazenamento local

Armazenar dados no armazenamento local significa usar o armazenamento do dispositivo local para armazenar dados relacionados ao aplicativo no dispositivo. Temos duas maneiras de armazenar os dados em um armazenamento local, a saberNSUserDefault e CoreData.

Vamos entendê-los em detalhes.

NSUserDefaults

NSUserDefaults destinam-se a armazenar pequenos pedaços de dados, como preferências, configurações ou valores individuais. Para usar UserDefaults em nosso aplicativo, precisamos apenas criar uma referência aos nsuserDefaults por meio de nosso código, conforme mostrado abaixo.

let defaultValues = NSUserDefaults.standardUserDefaults()

Para definir valores para dados em UserDefaults, podemos usar o seguinte código -

defaultValues.setObject("Simplified iOS", forKey: "nameKey")  
func setDouble(value: Double, forKey defaultName: String) 
func setBool(value: Bool, forKey defaultName: String) 
func setObject(value: AnyObject?, forKey defaultName: String) 
func setURL(url: NSURL?, forKey defaultName: String) 
func setInteger(value: Int, forKey defaultName: String) 
func setFloat(value: Float, forKey defaultName: String)

Para obter valores de NSUserDefaults, podemos usar o código a seguir.

func boolForKey(defaultName: String) -> Bool 
func integerForKey(defaultName: String) -> Int 
func floatForKey(defaultName: String) -> Float 
func doubleForKey(defaultName: String) -> Double 
func objectForKey(defaultName: String) -> AnyObject? 
func URLForKey(defaultName: String) -> NSURL?

Dados principais

CoreData é uma estrutura persistente, que suporta grandes transações de dados. CoreData permite que você construa um modelo de atributo de entidade relacional para armazenar dados do usuário. CoreData é uma estrutura e pode usar SQLite, formatos binários para armazenar dados.

Para usar CoreData em nosso aplicativo, começaremos com um novo projeto e certifique-se de marcar “Use Core Data”, ao criar o projeto.

Login Using core Data - Crie um novo projeto, selecione usar CoreData como mostrado na imagem a seguir.

Continue até que o projeto seja aberto, agora vemos que o projeto tem mais arquivos do que nossos projetos anteriores.

Este ficheiro CoreData_demo.xcdatamodeld é nosso banco de dados no qual estaremos fazendo nossa tabela de usuário e armazenando dados.

Concept - O problema do CoreData é que, mesmo se fecharmos o aplicativo e abri-lo depois de meses, ele ainda terá os dados que armazenamos, que veremos no próximo aplicativo que fizermos.

Agora veremos como adicionar dados centrais e recuperar dados centrais.

Adding Core Data- Para adicionar CoreData, clique no arquivo CoreData_demo.xcdatamodeld e então veremos que as entidades estão vazias. Clique no botão Adicionar Entidade, ele irá adicionar uma entidade, agora clique duas vezes no nome da entidade e renomeie como quiser.

Agora clique na entidade e podemos ver que o campo de atributos está vazio. Clique no símbolo de mais e renomeie a entidade. Selecione o tipo de entidade no próximo campo.

Nós adicionamos uma Entidade e um Atributo a ela. Agora, se formos para oAppDelegate.swift, podemos ver que duas novas funções foram adicionadas porque selecionamos CoreData. As duas funções adicionadas são -

Note - Importe CoreData em seu arquivo antes de prosseguir.

Saving data to Core Data - Para salvar alguns dados no CoreData, precisamos fazer um objeto da classe AppDelegate.

let appDelegate = UIApplication.shared.delegate as! AppDelegate

E, um objeto de contexto

let context = appDelegate.persistentContainer.viewContext

Então, precisamos criar um objeto de entidade, que chamará nossa entidade -

let newValue = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context)

Vamos agora definir o valor desse atributo que criamos.

newValue.setValue(textField.text, forKey: "name")

Vamos salvar os dados usando

context.save();

Fetching from core data- Durante a busca, as duas etapas acima (criar appDelegate e contexto) serão as mesmas. Em seguida, criaremos uma solicitação de busca.

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")

Vamos criar um objeto para armazenar o resultado.

let results = try context.fetch(request)

Em seguida, examinaremos os resultados de acordo com nossa exigência. Veremos mais CoreData com o próximo aplicativo que criarmos.

Challenge- Tenta criar uma aplicação, onde o usuário insere o nome, a seguir clica no login e fecha a aplicação. Na próxima vez que o usuário abrir o aplicativo, ele ainda deverá estar logado. Em seguida, adicione um botão - logout e, se ele clicar nele, o aplicativo solicitará o nome de usuário novamente.

Login / Logout usando CoreData

Crie um projeto de visualização única chamado 'Login', selecione o uso de CoreData. Clique em CoreData_demo.xcdatamodeld e adicione uma entidade chamada 'Usuários'. Dentro disso, adicione um atributo chamado 'nome'.

Vá para main.storyboard, adicione um campo de texto e um botão de login. Abaixo disso, adicione um rótulo, clique duas vezes nele e remova seu conteúdo. Em seguida, adicione um botão de logout, vá para o inspetor de atributos e torne 'alfa' igual a 0. Agora, nossa visualização deve ser a seguinte -

Agora, vá para o arquivo do controlador de visualização, abra o editor assistente e crie conexões entre os Elementos da IU e o arquivo do controlador.

Note- Também criaremos saídas para ambos os botões, pois precisamos modificar a aparência desses botões. Por exemplo - Quando um usuário está logado, vamos ocultar o botão de login, se o usuário não estiver logado mostraremos o login e ocultaremos o botão de logout.

Como já discutimos sobre como adicionar e buscar dados do CoreData, colocaremos o código aqui.

Try-Catch- Você notará que usamos o bloco try-catch muitas vezes no código. É porque se não usarmos os blocos try-catch e houver alguma exceção ou erro em nosso programa, a execução será interrompida. Ao passo que, se estivermos usando os blocos try catch e ocorrer algum erro, o bloco catch trata o erro. Leia mais sobre isso em nosso Tutorial Swift

Código para aplicativo de login / logout

Vamos entender os diferentes componentes e o código que é usado para um aplicativo de login / logout.

Login Button Action - O código a seguir explica como adicionar uma ação de botão de login.

var isLoggedIn = false 
@IBAction func logIn(_ sender: AnyObject) { 
   let appDelegate = UIApplication.shared.delegate as! AppDelegate
   let context = appDelegate.persistentContainer.viewContext 
   if isLoggedIn { 
      let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users") 
      do { 
         let results = try context.fetch(request) 
         if results.count > 0 { 
            for result in results as! [NSManagedObject] { 
               result.setValue(textField.text, forKey: "name") 
               do { 
                  try context.save() 
               } 
               catch { 
                  print("Update username failed") 
               } 
            } 
            label.text = "Hi " + textField.text! + "!" 
         } 
      } 
      catch { 
         print("Update failed") 
      } 
   } else { 
      let newValue = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context) 
      newValue.setValue(textField.text, forKey: "name") 
      do { 
         try context.save() 
         logInButton.setTitle("Update username", for: []) 
         label.alpha = 1 
         label.text = "Hi " + textField.text! + "!" 
         isLoggedIn = true 
         logOutButton.alpha = 1 
      }  
      catch { 
         print("Failed to save") 
      }     
   } 
}

Logout Button Action - O código a seguir explica como adicionar uma ação de botão de logout.

@IBAction func logOut(_ sender: AnyObject) { 
   let appDelegate = UIApplication.shared.delegate as! AppDelegate 
   let context = appDelegate.persistentContainer.viewContext 
   let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users") 
   do { 
      let results = try context.fetch(request) 
      if results.count > 0 { 
         for result in results as! [NSManagedObject] { 
            context.delete(result) 
            do { 
               try context.save() 
            } catch { 
               print("Individual delete failed") 
            } 
         } 
         label.alpha = 0 
         logOutButton.alpha = 0 
         logInButton.setTitle("Login", for: []) 
         isLoggedIn = false 
         textField.alpha = 1 
      } 
   } catch { 
      print("Delete failed") 
   } 
}

ViewDidLoad() - O código a seguir explica como usar a função ViewDidLoad ().

override func viewDidLoad() { 
   super.viewDidLoad() 
   // Do any additional setup after loading the view, typically from a nib.
   let appDelegate = UIApplication.shared.delegate as! AppDelegate 
   let context = appDelegate.persistentContainer.viewContext 
   let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users") 
   request.returnsObjectsAsFaults = false 
   do { 
      let results = try context.fetch(request) 
      for result in results as! [NSManagedObject] { 
         if let username = result.value(forKey: "name") as? String { 
            logInButton.setTitle("Update username", for: []) 
            logOutButton.alpha = 1 
            label.alpha = 1 
            label.text = "Hi there " + username + "!" 
         }     
      } 
             
   } catch { 
      print("Request failed") 
   } 
}

Lembre-se que você teve que criar uma saída e uma ação, para ambos os botões.

Agora, salve e execute o aplicativo. Faça login, feche o aplicativo e execute-o novamente. Deve ter a seguinte aparência.

Isso é tudo o que faremos com CoreData. Usando os mesmos conceitos, podemos construir muitos aplicativos CoreData.

Controlando o teclado

Nesta seção, aprenderemos a controlar o comportamento do teclado. Por exemplo - quando clicamos fora de um campo de texto após inserir algum texto, o teclado não fecha. Aqui, vamos entender como controlar o teclado.

O teclado deve desaparecer ao clicar fora do campo de entrada

Esta é uma tarefa simples, para fazer isso basta colar o código a seguir no arquivo viewController, antes de fechar as chaves.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
   self.view.endEditing(true)  
}

Ao fazer isso, o teclado desaparecerá ao clicar fora do campo de entrada.

O teclado deve desaparecer ao tocar na tecla de retorno

Para fazer o teclado desaparecer, devemos adicionar um novo tipo para o nosso controlador de visualização. Também adicionaremos um campo de texto e criaremos sua saída chamada textField. Por último, adicionaremos oUITextFieldDelegate.

Nós também control + drag do nosso campo de entrada para o controlador de visualização e selecione o delegado nas opções que aparecem.

Em seguida, adicionaremos a seguinte função.

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
   return true 
}

O arquivo final do View Controller deve ter a seguinte aparência -

import UIKit 
class ViewController: UIViewController, UITextFieldDelegate { 
   override func viewDidLoad() { 
      super.viewDidLoad() 
      // Do any additional setup after loading the view, typically from a nib. 
   }  
   override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated. 
   } 
   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
      self.view.endEditing(true) 
   }
   func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
      textField.resignFirstResponder() 
      return true 
   } 
}

Baixando Conteúdo da Web - Abrindo Facebook / Google

Nesta seção, aprenderemos como fazer um aplicativo, que abrirá o Facebook e o Google, quando cada botão for pressionado respectivamente. Também aprenderemos o conceito de visualizações da Web e segurança da camada de transporte do aplicativo. Depois disso, você poderá criar seu próprio navegador.

Note - Precisamos de uma conexão com a Internet neste aplicativo.

Fazendo um aplicativo da web

Faremos um novo aplicativo de visualização única, projeto iOS. Na barra de pesquisa da biblioteca de objetos, vamos pesquisar a visualização da web, arrastá-la e adicioná-la ao nosso controlador de visualização no main.Storyboard.

Depois de adicionar a visualização da web, iremos estendê-la a todos os cantos. A IU do aplicativo deve ser semelhante à seguinte -

Abriremos nosso main.storyboard e visualizaremos o controlador clicando no editor assistente. Vamos criar uma saída para nosso webView e ação para ambos os botões. Ao carregar, o aplicativo carregará o yahoo no webView. Ao clicar no google, deve carregar o Google, e ao clicar no botão do Facebook, deve carregar a página do Facebook.

A visão final deve ser a seguinte -

As capturas de tela a seguir mostram como devem ser as diferentes telas de nosso aplicativo. Se você tentar abrir um serviço da web que não seja https, ele mostrará um erro e teremos que adicionar uma exceção App Transport Layer Security em seuinfo.plist Arquivo.