Ad

Image Conversion From String Data Type To Image

- 1 answer

I am trying to display the image from table view cell to another controller. I am using table view cell to display the image, title and other properties. When the use click the table cell, I want to redirect the user in another controller and display those properties. I am trying to access the defined methods but I am getting following error Cannot assign value of type 'Data?' to type 'UIImage?' in didSelectRow function. The data is coming from API. Here is the JSON struct.

import Foundation

struct Movie: Decodable {
    let originalTitle: String
    let overview: String
    let posterPath: String
    
    enum CodingKeys: String, CodingKey {
        case originalTitle = "original_title"
        case overview
        case posterPath = "poster_path"
    }
    
}

Here is the methods I defined to retrieve those values.

   func getTitle(by row: Int) -> String? {
        return movies[row].originalTitle
    }
    
    func getOverview(by row: Int) -> String? {
        return movies[row].overview
    }
    
    func getImageData(by row: Int) -> Data? {
        return cache[row]
    }

Here is the Cell properties where I converted data to image.

class MovieViewCell: UITableViewCell {
    
    static let identifier = "MovieViewCell"
    

    @IBOutlet weak var movieImage: UIImageView!
    @IBOutlet weak var movieTitle: UILabel!
    @IBOutlet weak var movieOverview: UILabel!
    
    func configureCell(title: String?, overview: String?, data: Data?) {
        
        movieTitle.text = title
        movieOverview.text = overview
        
        if let imageData = data{
            movieImage.image = UIImage(data: imageData)
        }
    }
    
}

Here is the didSelectRow function.

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let dc = storyboard?.instantiateViewController(withIdentifier: "MovieDeatilsViewController") as! MovieDeatilsViewController
        
        let row = indexPath.row
       dc.titlemovie = presenter.getTitle(by: row) ?? ""
       dc.overview = presenter.getOverview(by: row) ?? ""
      dc.imagemovie = presenter.getImageData(by: row)
      
        self.navigationController?.pushViewController(dc, animated: true)
   }
    
    
}

Here is the details view controller code where I want to display the details.

class MovieDeatilsViewController: UIViewController {
    
    
    @IBOutlet weak var movieImage: UIImageView!
    
    @IBOutlet weak var movieTitle: UILabel!
    
    @IBOutlet weak var movieOverview: UILabel!
    
    
    var titlemovie = ""
    var overview = ""
    var imagemovie :UIImage?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        movieTitle.text = titlemovie
        movieOverview.text = overview
        movieImage.image = imagemovie
        
    
        
    }

}

Here is the screenshot of the error.

error

Ad

Answer

If you look at the method signature for getImageData:, you'll see that it returns Data?. Conversely, your imagemovie property is expecting a UIImage?. See where the issue is?

func getImageData(by row: Int) -> Data? {

var imagemovie :UIImage?

Instead of assigning a value of type Data? to your imagemovie property, you first must convert the Data? to a UIImage? like so:

dc.imagemovie = UIImage(data: presenter.getImageData(by: row)!)
Ad
source: stackoverflow.com
Ad