Desarrollo de iOS con Swift2 - iOS avanzado

En este capítulo, cubriremos algunas características avanzadas como crear múltiples vistas en nuestra aplicación, agregar barras de navegación, agregar vistas de tabla, almacenar datos en la aplicación, crear aplicaciones web, etc.

Repase cada sección con cuidado, ya que este capítulo contiene la mayoría de las cosas que necesitamos al desarrollar aplicaciones.

Controlador de vista múltiple

En nuestras aplicaciones anteriores, solo proporcionamos un único controlador de vista / vista. Sin embargo, podemos tener múltiples vistas en nuestra aplicación y podemos realizar cualquiera de ellas de forma independiente.

Por lo tanto, comenzaremos creando un nuevo proyecto; el nombre de este proyecto tiene varias vistas. Como cualquier otro proyecto, este proyecto también tiene un controlador de vista y un archivo Swift para ese controlador. (Esto se puede ver seleccionando Ver y ver sus propiedades en el Inspector de identidad).

La siguiente captura de pantalla muestra cómo se ve nuestra vista actual:

En el lado derecho (inspector de identidad), podemos ver la clase que está relacionada con nuestro controlador de vista. Esta flecha de la izquierda es el punto de entrada. Esta es la primera vista de nuestra aplicación que se mostrará después de que la aplicación comience a ejecutarse.

Agregar un segundo controlador de vista múltiple

Para agregar otros controladores de vista a nuestra aplicación, buscaremos controlador de vista en nuestra biblioteca de objetos. Una vez que lo encontremos, arrastraremos el controlador de vista a nuestro main.stroryboard, justo fuera de cualquier otra vista.

Así es como debería verse su aplicación. Ahora, hemos agregado un controlador de vista, pero ahora también necesitaremos crear una clase de controlador de vista para nuestra vista recién agregada.

Right click on your project → new File → cocoa Touch Class → Nómbrelo como quiera, lo llamaremos "SecondViewController".

Así es como crea un archivo de clase para su controlador de vista. Ahora, regrese a su “main.storyboard”, haga clic en su segundo controlador de vista y vea su Inspector de identidad.

El campo de la clase debe estar vacío en este momento, así que haga clic en ese campo y comience a escribir el nombre de su clase que agregó en el último paso. Si aparece, haga clic en entrar.

Ahora hemos creado un controlador de vista múltiple y agregado el archivo de clase de controlador para esa vista. Sin embargo, si ejecuta la aplicación, todavía no mostrará su segunda vista. ¿Por qué?

Porque no hemos agregado una función, que nos llevará a esa vista. En resumen, aún no hemos agregado Navigation a nuestra aplicación. No te preocupes; lo cubriremos en la siguiente sección.

Agregar navegación a la aplicación

El proceso de transición de una vista a otra se llama Segueing, es decir, se hace creando una transición entre las dos vistas. Para hacer esto, agregue un botón en el primer controlador de vista y controle el arrastre desde él a su segunda vista. Cuando suelte el botón, verá algunas opciones como se muestra en la captura de pantalla a continuación.

Seleccione la opción Mostrar de la Acción Segue. Ahora ejecute su aplicación, verá que al hacer clic en un botón, aparece su segunda vista (para ver más claramente agregue algo en su segunda vista, para que pueda identificarse).

Sin embargo, ahora no puede volver a su primera vista. Para eso tenemosNavigation controllers.

Agregar un controlador de navegación

Seleccione su primer controlador de vista y en la barra superior, haga clic en Editor → Embed in → Navigation controller.

Ahora, nuestra aplicación debería verse como la siguiente captura de pantalla.

Deberíamos asegurarnos de que haya una pequeña fila gris claro en la parte superior de la vista. Ahora, cuando ejecutamos la aplicación, podemos ver que hay una barra de navegación en la parte superior de la vista. Cuando hacemos clic en el botón, pasaremos a la segunda vista, donde veremos un botón de retroceso en esa barra de navegación. Haga clic en esto y regresaremos a la Vista inicial.

Agregar título y botón Atrás a la barra de navegación

Para agregar un título a su barra de navegación, haga clic en la barra de navegación y vea su inspector de atributos. Allí veremos -

  • Title - Este será el título de la barra de navegación, que aparece en el centro.

  • Prompt - Aparece en la parte superior de la barra de título, en el centro.

  • Back Button - Aquí puede modificar el Texto que aparece en el botón Atrás.

Actualmente, el botón que pasa la vista se encuentra en nuestra vista, lo que puede no ser adecuado si queremos que aparezca algo más en la pantalla. Por lo tanto, agregaremos un elemento de botón de barra en la barra de navegación, que nos llevará a nuestra segunda vista. Sin embargo, para esto, primero debemos eliminar el último botón que agregamos.

Agregar un elemento de botón de barra

Busque el elemento del botón de la barra en la biblioteca de objetos y arrastre y suelte al lado derecho de la barra de navegación. Nómbrelo como - “Siguiente>”, arrastre el control desde él a la segunda vista, seleccione Mostrar como hicimos con el último botón que agregamos.

Ahora ejecute la aplicación, se verá más limpia y mejor. Esto es todo lo que haremos con Navigation ahora mismo. En los capítulos siguientes, modificaremos la barra de navegación utilizando el código Swift, cuando sea necesario.

Vistas de tabla

Una tabla presenta los datos como una lista de una sola columna que contiene varias filas, que se pueden dividir en secciones. Deben usarse tablas para presentar los datos de una manera limpia y eficiente.

En esta sección, entenderemos cómo agregar vistas de tabla, agregar celdas prototipo, agregar fuentes de datos y delegados para una vista de tabla, cambiar las propiedades de una tabla y establecer datos dinámicos para celdas de vista de tabla.

Agregar una vista de tabla

Para agregar una vista de tabla, primero crearemos un nuevo proyecto y lo nombraremos como - "tableView". Luego, vaya a la biblioteca de objetos y busque Vista de tabla, veremos la vista de tabla, el controlador de vista de tabla y muchas otras opciones. Sin embargo, debemos seleccionar la vista de tabla, arrastrarla y agregarla a la vista predeterminada Controlador.

Agregar una celda prototipo

Estire la vista de tabla para que cubra la vista completa, mientras su vista de tabla está resaltada. Verifique su inspector de atributos, hay un campo llamado Celdas de prototipo, que actualmente es 0. Deberíamos cambiar su valor a 1, ahora su vista debería verse como sigue -

Cambio de identificador de celda

Ahora, dentro de su vista, haga clic en su celda prototipo (que es un poco complicado). Entonces, en el esquema de su documento, haga clic en Ver controlador → Ver → Vista de tabla → Celda de vista de tabla, y ahora en su inspector de atributos hay una columna llamada Identificador, haga clic en eso y asígnele el nombre "Celda". Vea las siguientes capturas de pantalla para comprender los pasos anteriores.

Agregar delegado y fuente de datos

Para que nuestras vistas de tabla sean dinámicas, las necesitamos para cargar datos dinámicos. Por lo tanto, necesitamos un delegado y una fuente de datos para eso. Para hacer un delegado y una fuente de datos de su tabla, controle el arrastre desde la vista de tabla a su controlador de vista o el botón amarillo en la parte superior del controlador de vista como se muestra en la captura de pantalla a continuación.

Cuando sueltemos el cursor, veremos dos opciones allí, dataSource y delegate, selecciónelas una por una (cuando seleccione una opción, la ventana emergente se ocultará, deberá repetir el paso anterior para agregar una segunda opción) . Ahora debería verse como ...

Esto es todo lo que haremos con nuestro UI / Main.Storyboard, ahora mismo. Ahora cambie al archivo "ViewController.swift". AñadirUITableViewDelegate, UITableViewDataSource, a su viewController.swift como se muestra a continuación -

Sin embargo, ahora Xcode mostrará un error en esta línea.

Esto se debe a que hay un par de métodos en los que debemos usar UITableView

Para ver estos métodos, presione Comando + clic en UITableViewDataSouce, y copie los dos primeros métodos, con los argumentos “numberOfRowsInSection”, “cellForRowAtIndex” y péguelos en ViewController.swift, antes de viewDidLoad ().

Quitar esta línea @available(iOS 2.0, *), de ambos métodos y agregue las llaves de apertura y cierre "{}". Ahora, la vista se verá de la siguiente manera:

Xcode debe mostrar un error en ambas funciones. Sin embargo, no se preocupe, ya que esto se debe a que no hemos agregado un tipo de retorno de esas funciones.

numberOfRowsInSection- Esta función define el número de filas que contendrá nuestra sección. Así que ahora agregue esta línea a su método.

return 1 //This will return only one row.

cellForRowAt - Este método devuelve el contenido de cada celda, indexPathcontiene el índice de cada celda. Crearemos una celda y luego asignaremos algún Valor a esa Celda y finalmente devolveremos la celda.

Ahora, sus funciones deberían verse como sigue:

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 
}

En la primera línea, estamos creando una celda con el estilo predeterminado y reuseIdentifier es el nombre de la celda prototipo que hicimos.

Cell.textLable?.text - Esto define el texto que debe aparecer como título de esa celda.

Finalmente, devolvemos una celda desde allí. Intente ejecutar su aplicación ahora, debería tener el siguiente aspecto:

Aplicación de horario

En esta aplicación continuaremos nuestro último proyecto, y haremos una aplicación donde imprimimos la tabla de 2 (2… 10…. 20).

Entonces, para hacer esta aplicación, simplemente cambie el archivo del controlador de vista del proyecto.

Cambie las funciones como se muestra a continuación:

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") 
}

Ahora, ejecute su aplicación. Debería verse como se muestra a continuación.

Ahora que hemos completado las vistas de la tabla y hemos creado una aplicación, aquí tenemos un desafío rápido que debemos resolver.

Desafío

Hacer una aplicación, donde imprimimos la tabla de conteo de cualquier número que ingrese el usuario.

Hint- Tome entrada, agregue un botón, que cuando se presione cargará la tabla con el conteo de ese número. Aquí también necesitaremos la siguiente función, que recargará los datos de la tabla.

tableView.reloadData()

Este es un desafío para usted, ya que hemos cubierto todos los temas sobre esta aplicación, por lo que no brindaremos una solución para esto.

Aplicación Egg Timer

En esta aplicación, usaremos el concepto de Timer() y Class Constructor, que gestiona el tiempo. Le proporcionaremos el concepto y la codificación. Debe crear la interfaz de usuario usted mismo, ya que ya hemos discutido cada elemento de la interfaz de usuario muchas veces en nuestros capítulos anteriores. (Aunque proporcionaremos sugerencias para todo lo que parezca bastante nuevo).

El diseño final de la aplicación debería verse así:

¿Qué pasa en esta aplicación?

  • La etiqueta del título tiene un valor inicial 210.

  • Al hacer clic en el botón de reproducción, el valor debería disminuir en uno por segundo.

  • Al hacer clic en la pausa, el valor debe detenerse solo allí.

  • Al hacer clic en -10, el valor debe reducirse en 10 y la disminución debe continuar.

  • Al hacer clic en +10, el valor debe aumentarse en 10 y la disminución debe continuar.

  • Al hacer clic en Restablecer, el valor debería convertirse en 210.

  • El valor nunca debe bajar de 0.

Concepto

  • Usaremos una variable de clase Timer () → var timer = Timer ().

  • Estableceremos un valor para esta variable de temporizador que acabamos de crear.

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

    • timeInterval -> es el intervalo de tiempo que queremos usar,

    • target -> es el controlador de vista que debe realizarse,

    • selector -> es el nombre de la función que usará este temporizador,

    • userInfo -> null y se repite, sí, queremos repetir para que sea cierto.

Temporizador de invalidación

Para detener un temporizador a través de la programación, agregaremos timer.invalidate() función.

Elements we have used -

Navigation bar - En la barra de navegación, hemos agregado tres elementos.

  • Elemento de botón de barra, uno a la izquierda y otro a la derecha.
  • Título denominado como - "Nuestro temporizador de huevos".

Toolbar - Aparece una barra de herramientas en la parte inferior de la pantalla de una aplicación y contiene botones para realizar acciones relevantes para la vista actual o el contenido dentro de ella.

Las barras de herramientas son translúcidas y pueden tener un tinte de fondo. A menudo se esconden cuando es poco probable que la gente los necesite.

Hemos agregado una barra de herramientas en la parte inferior de nuestra interfaz de usuario, que tiene 5 elementos.

  • Tres elementos de botón de barra, llamados -10, Reset y +10.
  • Dos espacios flexibles: espacio flexible entre los elementos de los botones de la barra -

¿Cómo agregar un ícono al elemento del botón de la barra?

Seleccione el elemento de su botón de barra. Haga clic en el elemento del botón de la barra, vaya al inspector de atributos, haga clic en Seleccionar elemento y elija el elemento del menú desplegable que aparece.

Del mismo modo, seleccione elementos para todos los demás botones y cree una interfaz de usuario como se indica arriba. Agregue una etiqueta en el centro de la Vista y conéctela como una salida, asígnele el nombre -timeLeftLabel.

Acción para el temporizador de inicio

A continuación se muestra el programa para el temporizador de inicio.

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

Crea la siguiente función -

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

Acción para la función de parada

A continuación se muestra el programa para la función de parada.

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

Acción para restar tiempo

A continuación se muestra el programa para restar tiempo.

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

Acción para restablecer el tiempo

A continuación se muestra el programa para restablecer la hora.

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

Acción para addTime

A continuación se muestra el programa para agregar tiempo.

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

Ahora, viewController.swift debería verse así:

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

Esto es todo lo que haremos en nuestra aplicación, intente ejecutar la aplicación, debería funcionar bien.

Almacenamiento de datos en almacenamiento local

Almacenar datos en el almacenamiento local significa utilizar el almacenamiento del dispositivo local para almacenar datos relacionados con la aplicación en el dispositivo. Tenemos dos formas de almacenar los datos en un almacenamiento local, a saberNSUserDefault y CoreData.

Entendamos en detalle.

NSUserDefaults

NSUserDefaults está destinado a almacenar pequeños fragmentos de datos, como preferencias, configuraciones o valores individuales. Para usar UserDefaults en nuestra aplicación, solo necesitamos crear una referencia a nsuserDefaults a través de nuestro código como se muestra a continuación.

let defaultValues = NSUserDefaults.standardUserDefaults()

Para establecer valores en los datos en UserDefaults, podemos usar el siguiente 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 obtener valores de NSUserDefaults, podemos usar el siguiente código.

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?

CoreData

CoreData es un marco persistente que admite grandes transacciones de datos. CoreData le permite crear un modelo relacional de entidad-atributo para almacenar datos de usuario. CoreData es un marco y puede usar formatos binarios de SQLite para almacenar datos.

Para usar CoreData en nuestra aplicación, comenzaremos con un nuevo proyecto y nos aseguraremos de marcar "Usar Core Data", mientras crea el proyecto.

Login Using core Data - Cree un nuevo proyecto, seleccione usar CoreData como se muestra en la siguiente captura de pantalla.

Continúe hasta que el proyecto esté abierto, ahora vemos que el proyecto tiene más archivos que nuestros proyectos anteriores.

Este archivo CoreData_demo.xcdatamodeld es nuestra base de datos en la que crearemos nuestra tabla de usuarios y almacenaremos los datos.

Concept - Lo que pasa con CoreData es que, incluso si cerramos la aplicación y la abrimos después de meses, seguirá teniendo los datos que almacenamos, que veremos en la próxima aplicación que hagamos.

Ahora veremos cómo agregar datos centrales y recuperar datos centrales.

Adding Core Data- Para agregar CoreData, haga clic en el archivo CoreData_demo.xcdatamodeld y luego veremos que las entidades están vacías. Haga clic en el botón Agregar entidad, agregará una entidad, ahora haga doble clic en el nombre de la entidad y cámbiele el nombre que desee.

Ahora haga clic en la entidad y podemos ver que el campo de atributos está vacío. Haga clic en el símbolo más y cambie el nombre de la entidad. Seleccione el tipo de entidad en el siguiente campo.

Hemos agregado una entidad y un atributo en ella. Ahora, si vamos alAppDelegate.swift, podemos ver que se han agregado dos nuevas funciones porque seleccionamos CoreData. Las dos funciones agregadas son:

Note - Importe CoreData en su archivo antes de continuar.

Saving data to Core Data - Para guardar algunos datos en CoreData, necesitamos crear un objeto de AppDelegate Class.

let appDelegate = UIApplication.shared.delegate as! AppDelegate

Y un objeto de contexto

let context = appDelegate.persistentContainer.viewContext

Luego, necesitamos crear un objeto de entidad, que llamará a nuestra entidad -

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

Ahora estableceremos el valor de ese atributo que creamos.

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

Guardaremos los datos usando

context.save();

Fetching from core data- Al buscar, los dos pasos anteriores (crear appDelegate y context) serán los mismos. Luego, crearemos una solicitud de recuperación.

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

Crearemos un objeto para almacenar el resultado.

let results = try context.fetch(request)

Luego revisaremos los resultados según nuestro requisito. Veremos más de CoreData con la próxima aplicación que creemos.

Challenge- Intente crear una aplicación, donde el usuario ingrese el nombre, luego haga clic en iniciar sesión y cierre la aplicación. La próxima vez que el usuario abra la aplicación, aún debe estar conectado. Luego agregue un botón - cerrar sesión, y si hace clic en él, la aplicación le pedirá el nombre de usuario nuevamente.

Iniciar sesión / Cerrar sesión con CoreData

Cree un proyecto de vista única llamado 'Iniciar sesión', seleccione el uso de CoreData. Haga clic en CoreData_demo.xcdatamodeld y agregue una entidad llamada 'Usuarios'. Dentro de eso, agregue un atributo llamado 'nombre'.

Vaya a main.storyboard, agregue un campo de texto y un botón de inicio de sesión. Debajo de eso, agregue una etiqueta, haga doble clic en ella y elimine su contenido. Luego, agregue un botón de cierre de sesión, vaya a su inspector de atributos y haga que 'alfa' sea igual a 0. Ahora, nuestra vista debería verse de la siguiente manera:

Ahora, vaya a su archivo de controlador de vista, abra el editor asistente y cree conexiones entre los elementos de la interfaz de usuario y su archivo de controlador.

Note- También crearemos salidas para ambos botones, porque necesitamos modificar el aspecto de esos botones. Por ejemplo: cuando un usuario inicia sesión, ocultaremos el botón de inicio de sesión, si el usuario no inició sesión mostraremos inicio de sesión y ocultaremos el botón de cierre de sesión.

Como ya hemos comentado acerca de cómo agregar y obtener datos de CoreData, colocaremos el código aquí.

Try-Catch- Notará que hemos usado el bloque try-catch muchas veces en el código. Es porque si no usamos los bloques try-catch y hay alguna excepción o error en nuestro programa, la ejecución se detendrá. Mientras que, si estamos usando los bloques try catch y si ocurre algún error, entonces el bloque catch maneja el error. Lea más sobre esto en nuestro tutorial de Swift

Código para la aplicación de inicio de sesión / cierre de sesión

Entendamos los diferentes componentes y el código que se utiliza para una aplicación de inicio / cierre de sesión.

Login Button Action - El siguiente código explica cómo agregar una acción de botón de inicio de sesión.

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 - El siguiente código explica cómo agregar una acción de botón de cierre de sesión.

@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() - El siguiente código explica cómo utilizar la función 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") 
   } 
}

Recuerde que tenía que crear una salida y una acción, para ambos botones.

Ahora, guarde y ejecute la aplicación. Inicie sesión, cierre la aplicación y ejecútela nuevamente. Debería verse como sigue.

Eso es todo lo que haremos con CoreData. Usando los mismos conceptos, podemos construir muchas aplicaciones CoreData.

Controlar el teclado

En esta sección, aprenderemos a controlar el comportamiento del teclado. Por ejemplo: cuando hacemos clic fuera de un campo de texto después de ingresar texto, el teclado no se cierra. Aquí, entenderemos cómo controlar el teclado.

El teclado debería desaparecer al hacer clic fuera del campo de entrada

Esta es una tarea simple, para hacer esto simplemente pegue el siguiente código en su archivo viewController, antes de cerrar las llaves.

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

Al hacer esto, hará que el teclado desaparezca al hacer clic fuera del campo de entrada.

El teclado debería desaparecer al tocar la tecla de retorno

Para hacer desaparecer el teclado, debemos agregar un nuevo Tipo para nuestro Controlador de vista. También agregaremos un campo de texto y crearemos su salida llamada textField. Por último, agregaremos elUITextFieldDelegate.

Lo haremos también control + drag desde nuestro campo de entrada al controlador de vista y seleccione delegar de las opciones que aparecen.

Luego, agregaremos la siguiente función.

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

El archivo final del controlador de vista debería verse como sigue:

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

Descarga de contenido web: apertura de Facebook / Google

En esta sección, aprenderemos cómo hacer una aplicación, que abrirá Facebook y Google, cuando se presione cada botón respectivamente. También aprenderemos el concepto de vistas web y seguridad de la capa de transporte de aplicaciones. Después de esto, podrá crear su propio navegador.

Note - Necesitamos una conexión a Internet en esta aplicación.

Hacer una aplicación web

Crearemos una nueva aplicación de vista única, proyecto iOS. En la barra de búsqueda de la biblioteca de objetos, buscaremos la vista web, la arrastraremos y la agregaremos a nuestro controlador de vista en el storyboard principal.

Después de agregar la vista web, la estiraremos a todas las esquinas. La interfaz de usuario de la aplicación debería tener el siguiente aspecto:

Abriremos nuestro main.storyboard y veremos el controlador haciendo clic en el editor asistente. Crearemos una salida para nuestro webView y acción para ambos botones. Al cargar, la aplicación cargará yahoo en webView. Al hacer clic en Google, debería cargar Google, y al hacer clic en el botón de Facebook, debería cargar la página de Facebook.

La vista final debería verse como sigue:

Las siguientes capturas de pantalla muestran cómo deberían verse las diferentes pantallas de nuestra aplicación. Si intenta abrir un servicio web que no es https, mostrará un error y tendremos que agregar una excepción de Seguridad de la capa de transporte de la aplicación en suinfo.plist archivo.