0

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.

app toast

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

1 Answers1

0

Looking at the screenshot attached, it can be achieved using the default UIAlertViewController class.

By using extension to UIViewController it can be used in any view controllers.

extension UIViewController {
    func showToast(title: String, message: String) {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
        
        alertController.addAction(UIAlertAction(title: "Aceptar", style: .default))
        
        present(alertController, animated: true, completion: nil)
    }
}

Usage in ViewController

class DetailViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        DispatchQueue.main.async {
            self.showToast(title: "UPS!", message: "Thomas Ederson")
        }
    }
}

screenshot