0

I created four label inside the table view cell to fetch the data from Api . The link is https://coinmap.org/api/v1/venues/ . I have two swift file one is to define the tabelview property and other one is for Label with cell . When I run the app it displaying the tableview cell but not displaying the data with label . Here is the model .

// MARK: - Welcome
struct Coin: Codable {
    let venues: [Venue]
}

// MARK: - Venue
struct Venue: Codable {
    let id: Int
    let lat, lon: Double
    let category, name: String
    let createdOn: Int
    let geolocationDegrees: String

    enum CodingKeys: String, CodingKey {
        case id, lat, lon, category, name
        case createdOn = "created_on"
        case geolocationDegrees = "geolocation_degrees"
    }
}

Here is the Network Manager .

class NetworkManager {
    
    func getCoins(from url: String, completion: @escaping (Result<Coin, NetworkError>) -> Void ) {
        
        guard let url = URL(string: url) else {
            completion(.failure(.badURL))
            return
        }
        
        URLSession.shared.dataTask(with: url) { data, response, error in

            if let error = error {
                completion(.failure(.other(error)))
                return
            }

            if let data = data {
                //decode
                do {
                    let response = try JSONDecoder().decode(Coin.self, from: data)
                    completion(.success(response))
                } catch let error {
                    completion(.failure(.other(error)))
                }
            }
        }
        .resume()
    }
    
    
}

Here is the presenter .

class VenuePresenter : VanueProtocol{

    // creating instance of the class
    private let view : VanueViewProtocol
    private let networkManager: NetworkManager
    private var vanues = [Venue]()
    var rows: Int{
        return vanues.count
    }
    // initilanize the class
    init(view:VanueViewProtocol , networkmanager:NetworkManager = NetworkManager()){
        self.view = view
        self.networkManager = networkmanager
    }
    
    
    func getVanue(){
        
        let url  = "https://coinmap.org/api/v1/venues/"
        
        networkManager.getCoins(from: url) { result in
            
            switch result {
            case.success(let respone):
                self.vanues = respone.venues
                           DispatchQueue.main.async {
                               self.view.resfreshTableView()
                           }
                       case .failure(let error):
                           DispatchQueue.main.async {
                               self.view.displayError(error.errorDescription ?? "")
                               print(error)
                           }
            }
        }
    }
    
    
    

    func getId(by row: Int) -> Int {
        return vanues[row].id
    }
    
    func getLat(by row: Int) -> Double {
        return vanues[row].lat
    }
    
    func getCreated(by row: Int) -> Int {
        return vanues[row].createdOn
    }
    
    func getLon(by row: Int) -> Double? {
        return vanues[row].lon
    }
    
    
}

Here is the view controller .

class ViewController: UIViewController{

    
    private var presenter : VenuePresenter!
   
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        setUpUI()
        presenter = VenuePresenter(view: self)
        presenter.getVanue()
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DisplayView1")
        // Do any additional setup after loading the view.
    }
    private func setUpUI() {
        tableView.dataSource = self
        tableView.delegate = self
    }
    
    
}

extension ViewController : VanueViewProtocol{
    func resfreshTableView() {
        tableView.reloadData()
        
    }
       func displayError(_ message: String) {
            let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert)
            let doneButton = UIAlertAction(title: "Done", style: .default, handler: nil)
            alert.addAction(doneButton)
            present(alert, animated: true, completion: nil)
        }
    }
extension ViewController: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        presenter.rows
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        guard let cell = tableView.dequeueReusableCell(withIdentifier: DisplayView.identifier, for: indexPath) as? DisplayView
          else { return UITableViewCell() }
        
        let row = indexPath.row
        let id   = presenter.getId(by: row)
         let lat = presenter.getLat(by: row)
        guard let lon = presenter.getLon(by: row) else { return UITableViewCell() }
        let createdOn = presenter.getCreated(by: row)
        cell.configureCell(id: id, lat: lat, lon: lon, createdOn: createdOn)
        return cell
    }
}
extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }
}
    

Here is the display view swift .

class DisplayView: UITableViewCell{
    
    static let identifier = "DisplayView1"
    
    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var label2: UILabel!
    @IBOutlet weak var label3: UILabel!
    @IBOutlet weak var label4: UILabel!
    
    func configureCell(id: Int ,lat : Double , lon : Double , createdOn: Int){
        label1.text = String(id)
        label2.text = String(lat)
        label3.text = String(lon)
        label4.text = String(createdOn)
    
    }
   
    
    
}

Here is the screenshot is empty not displaying the data . enter image description here

0

1 Answer 1

1

You are registering a generic cell:

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DisplayView1")

You need to register your custom cell:

self.tableView.register(DisplayView.self, forCellReuseIdentifier: DisplayView.identifier)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.