Estas son mis notas para el curso https://www.hackingwithswift.com
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

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