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.
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)!)