Home > OS >  Swift Image conversion from string data type to Image
Swift Image conversion from string data type to Image

Time:02-16

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

CodePudding user response:

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)!)
  • Related