Categories
Swift Development

100 Días de Swift Día 23

Estas son mis notas para el curso https://www.hackingwithswift.com

Entrada anterior

Puntos claves

Accesar archivos en el Bundle de la app

let items = try! fm.contentsOfDirectory(atPath: path)

fm se refiere a FileManager y path se refiere a la ruta desde el Bundle de la App el cual indicamos con una String

try! es necesario por si no se encuentran nuestros archivos

Crear celdas en una tabla

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return pictures.count
}

En este código especificamos el numero de celdas para nuestra tabla, nuestra tabla fue hecha con un ViewController pero luego cambiamos por un UITableViewController que hereda de viewController pero ademas tiene lo necesario para una tabla.

Enlace para abrir la vista a detalle

let cell = tableView.dequeueReusableCell(withIdentifier: "Picture", for: indexPath)

if let vc = storyboard?.instantiateViewController(withIdentifier: "Detail") as? DetailViewController {
}

Estas dos lineas de código se hace referencia a el storyboard con código usando un String como identificador.

Ahora en la segunda linea se usa as? para agregar las propiedades de la clase y por usarlo en nuestro código, si es que el storyboard contiene esa clase

Challenge

Mostrar una tabla con nombres de banderas, vista a detalle y botones para compartir

storyboard

Flags Model

import Foundation

struct ItemCard {
    var id = UUID()
    var name: String
    var description: String
    var capital : String
    var nombreCompleto : String
    
    static var example : [ItemCard] {
        return [...]
    }
}

View Controller

//
//  ViewController.swift
//  ChallengeOne
//
//  Created by Francisco Misael Landero Ychante on 27/08/20.
//  Copyright © 2020 Francisco Misael Landero Ychante. All rights reserved.
//

import UIKit

class ViewController: UITableViewController {

    let estados : [ItemCard] = ItemCard.example
    
    override func viewWillAppear(_ animated: Bool) {
        title = "Estados de 🇲🇽 México" 
      }
      
      //Numero de celdas
      override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
          return estados.count
      }
      
      //crear la celda
      override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
          //crear la celda, usamos el que asignmos en el storyvoard
          //reusamos la celda
          let cell = tableView.dequeueReusableCell(withIdentifier: "estadoCell", for: indexPath)
          
          //le damos un texto a nuestra celda con el nombre de nuestras imagenes
          cell.textLabel?.text = estados[indexPath.row].nombreCompleto
        
          let imageName = UIImage(named: estados[indexPath.row].name)
          cell.imageView?.image = imageName
          return cell
      }
    
    
   override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //buscamos en nuestro story board nuestro detail view
        if let vc = storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController {
            //en el detailview asignamos el nombre de la imagen segun la celda seleccionada
            
            vc.bind(estados[indexPath.row])
            
            //en el navigation controller empujamos la nueva vista
            navigationController?.pushViewController(vc, animated: true)
        }
        
    }
    
}

DetailViewController

//
//  DetailViewController.swift
//  ChallengeOne
//
//  Created by Francisco Misael Landero Ychante on 27/08/20.
//  Copyright © 2020 Francisco Misael Landero Ychante. All rights reserved.
//

import UIKit

class DetailViewController : UIViewController {
    
    @IBOutlet var image: UIImageView!
    @IBOutlet var name: UILabel!
    @IBOutlet var labelDes: UILabel!
    
    var estado : ItemCard?
      
      
      override func viewDidLoad() {
        
        title = estado?.name
        self.navigationController?.navigationBar.prefersLargeTitles = false
        
        let imageFlag = UIImage(named: estado!.name)
        image.image = imageFlag
        
        name.text = estado?.nombreCompleto
        labelDes.text = estado?.description
        
        //Button en el la barra de navegacion
               navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareTapped))
        
        
      }
      
    func bind(_ model : ItemCard) {
        
        self.estado = model
        
    }
    
    @objc func shareTapped(){
           
           //Verificar si tenemos una imagen
           guard let image = image.image?.jpegData(compressionQuality: 0.8) else {
               print("No se encontro niguna imagen")
               return
           }
           
           guard let imageTitle = estado?.nombreCompleto else {
                      print("No se encontro niguna imagen")
                      return
                  }
            
           
           //Que vamos a compatir
           let vc = UIActivityViewController(activityItems: [image,imageTitle], applicationActivities: [])
           
           //permitir que la ventana semuestra en el ipad
           vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
           
           //mostrar la ventana de compartir
           present(vc,animated: true)
       }
       
    
}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *