How to display a Toast MessageDialog in Swift using TableView and TableViewCell

119 views Asked by At

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

There are 1 answers

0
Dayanithi Natarajan On

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