I need to create a toast message dialog in my app, basically i have a TableView and within it i have a TableViewCell. I need that when the user press the cell to go to the DetailViewController the toast message dialog display all the data that i need.
Controllers
ViewController
import UIKit
class ViewController: UIViewController {
var parser = Parser()
var welcome = Welcome(pageTitle: "", backTitle: "", messageDialog: MessageDialog(title: "", acceptButton: ""), items: [])
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var pageTitle: UILabel!
@IBOutlet weak var backButton: UINavigationItem!
override func viewDidLoad() {
super.viewDidLoad()
parser.getInfo{
data in
self.welcome = data
self.tableView.reloadData()
}
tableView.delegate = self
tableView.dataSource = self
pageTitle.text = welcome.pageTitle
backButton.backButtonTitle = welcome.backTitle
}
}
extension ViewController : UITableViewDelegate, UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return welcome.items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = welcome.items[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
// asignaciones para el nombre
cell.name.text = item.name
cell.name.textColor = hexStringToUIColor(hex: item.nameColor)
// asignaciones para el trabajo
cell.job.text = item.job
cell.job!.textColor = hexStringToUIColor(hex: item.jobColor)
// asignaciones para el pais
cell.country.text = item.country
cell.job!.textColor = hexStringToUIColor(hex: item.countryColor)
guard let imageURL = URL(string: item.url)else{fatalError("Sin imagen")}
DispatchQueue.global().async {
guard let imageData = try? Data(contentsOf: imageURL)else{return}
let image = UIImage(data: imageData)
DispatchQueue.main.async {
cell.photo.image = image
self.tableView.reloadData()
}
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item = welcome.items[indexPath.row]
if let vc = storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController{
vc.image = item.url
vc.userName = item.name
vc.userNameColor = item.nameColor
vc.userJob = item.job
vc.userJobColor = item.jobColor
vc.userContry = item.country
vc.userContryColor = item.countryColor
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
func hexStringToUIColor (hex:String) -> UIColor {
var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
if (cString.hasPrefix("#")) {
cString.remove(at: cString.startIndex)
}
if ((cString.count) != 6) {
return UIColor.gray
}
var rgbValue:UInt64 = 0
Scanner(string: cString).scanHexInt64(&rgbValue)
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
}
DetailViewController
//
// DetailViewController.swift
// prueba
//
// Created by Mateo Valencia on 20/09/22.
//
import UIKit
class DetailViewController: UIViewController {
@IBOutlet weak var backTitle: UINavigationItem!
@IBOutlet weak var photo: UIImageView!
@IBOutlet weak var name: UILabel!
@IBOutlet weak var job: UILabel!
@IBOutlet weak var country: UILabel!
var image : String?
var userName : String?
var userNameColor : String?
var userJob : String?
var userJobColor : String?
var userContry : String?
var userContryColor : String?
override func viewDidLoad() {
super.viewDidLoad()
guard let imageURL = URL(string: image!)else{fatalError("Sin imagen")}
DispatchQueue.global().async {
guard let imageData = try? Data(contentsOf: imageURL)else{return}
let imageView = UIImage(data: imageData)
DispatchQueue.main.async {
self.photo.image = imageView
}
}
name.text = userName
name.textColor = hexStringToUIColor(hex: userNameColor ?? "")
job.text = userJob
job.textColor = hexStringToUIColor(hex: userJobColor ?? "")
country.text = userContry
country.textColor = hexStringToUIColor(hex: userContryColor ?? "")
country.textAlignment = NSTextAlignment.right
}
}
ViewModel
//
// Parser.swift
// prueba
//
// Created by Mateo Valencia on 19/09/22.
//
import Foundation
struct Parser{
func getInfo(completion: @escaping (Welcome) ->()){
let json = """
{
"pageTitle":"Inicio",
"backTitle":"AtrĂ¡s",
"messageDialog":{
"title":"Ups",
"acceptButton":"Aceptar"
},
"items": [
{
"name":"Thomas Ederson",
"nameColor":"#000000",
"url":"https://image.shutterstock.com/image-photo/head-shot-portrait-close-smiling-260nw-1714666150.jpg",
"job":"CEO",
"jobColor":"#000000",
"country":"CO",
"countryColor":"#000000",
"launchMessageDialog":true
},
{
"name":"Thomas Ederson",
"nameColor":"#000000",
"url":"https://image.shutterstock.com/image-photo/head-shot-portrait-close-smiling-260nw-1714666150.jpg",
"job":"CEO",
"jobColor":"#000000",
"country":"CO",
"countryColor":"#000000",
"launchMessageDialog":true
},
{
"name":"Thomas Ederson",
"nameColor":"#000000",
"url":"https://image.shutterstock.com/image-photo/head-shot-portrait-close-smiling-260nw-1714666150.jpg",
"job":"CEO",
"jobColor":"#000000",
"country":"CO",
"countryColor":"#000000",
"launchMessageDialog":true
},
{
"name":"Thomas Ederson",
"nameColor":"#000000",
"url":"https://image.shutterstock.com/image-photo/head-shot-portrait-close-smiling-260nw-1714666150.jpg",
"job":"CEO",
"jobColor":"#000000",
"country":"CO",
"countryColor":"#000000",
"launchMessageDialog":true
},
{
"name":"Thomas Ederson",
"nameColor":"#000000",
"url":"https://image.shutterstock.com/image-photo/head-shot-portrait-close-smiling-260nw-1714666150.jpg",
"job":"CEO",
"jobColor":"#000000",
"country":"CO",
"countryColor":"#000000",
"launchMessageDialog":true
},
{
"name":"Thomas Ederson",
"nameColor":"#000000",
"url":"https://image.shutterstock.com/image-photo/head-shot-portrait-close-smiling-260nw-1714666150.jpg",
"job":"CEO",
"jobColor":"#000000",
"country":"CO",
"countryColor":"#000000",
"launchMessageDialog":true
}
]
}
""".data(using: .utf8)!
let welcome: Welcome = try! JSONDecoder().decode(Welcome.self, from: json)
completion(welcome)
}
}
Models
import Foundation
// MARK: - Item
struct Item: Codable {
let name, nameColor: String
let url: String
let job, jobColor, country, countryColor: String
let launchMessageDialog: Bool
}
import Foundation
import UIKit
class Cell{
var photo : UIImageView
var name: String
var job: String
init(photo: UIImageView, name: String, job: String){
self.photo = photo
self.name = name
self.job = job
}
}
import Foundation
// MARK: - Welcome
struct Welcome: Codable {
let pageTitle, backTitle: String
let messageDialog: MessageDialog
let items: [Item]
init(pageTitle: String, backTitle: String, messageDialog: MessageDialog, items: [Item]){
self.pageTitle = pageTitle
self.backTitle = backTitle
self.messageDialog = messageDialog
self.items = items
}
}
import Foundation
// MARK: - MessageDialog
struct MessageDialog: Codable {
let title, acceptButton: String
init(title: String, acceptButton: String){
self.title = title
self.acceptButton = acceptButton
}
}
CustomCell
//
// CustomCell.swift
// prueba
//
// Created by Mateo Valencia on 19/09/22.
//
import UIKit
class CustomCell: UITableViewCell {
@IBOutlet weak var photo: UIImageView!
@IBOutlet weak var name: UILabel!
@IBOutlet weak var job: UILabel!
@IBOutlet weak var country: UILabel!
}