0

I've successfully parsed images to cellForRowAt but now need to display it for didSelectRowAt for a recipe in the ResultsViewController, and having trouble.

RecipeTableViewController.swift

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! RecipeTableViewCell

    if let item = tableViewDataSource[indexPath.item] as? Recipe {
        if isSearching {
            cell.item = filteredData[indexPath.row]
            cell.recipeImage.downloadImage(from: (self.filteredData[indexPath.item].image))
        } else {
            cell.item = item
            cell.recipeImage.downloadImage(from: (self.tableViewDataSource[indexPath.item].image))
        }
    }

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let Storyboard = UIStoryboard(name: "Main", bundle: nil)
    let resultsVC = Storyboard.instantiateViewController(withIdentifier: "ResultsViewController") as! ResultsViewController

    // Information to be passed to ResultsViewController

    if (tableViewDataSource[indexPath.item] as? Recipe) != nil {
        if isSearching {
            resultsVC.getTitle = filteredData[indexPath.row].title
            resultsVC.getIngredients = filteredData[indexPath.row].ingredients
            // Parse Image
        } else {
            resultsVC.getTitle = tableViewDataSource[indexPath.row].title
            resultsVC.getIngredients = tableViewDataSource[indexPath.row].ingredients
            // Parse Image
            //resultsVC.getImage = resultsVC.imageDisplay.downloadImage(from (self.tableViewDataSource[indexPath.item].image))
        }
    }
    // Push to next view
    self.navigationController?.pushViewController(resultsVC, animated: true)

}

extension UIImageView {
func downloadImage(from url: String) {
    let urlRequest = URLRequest(url: URL(string: url)!)
    let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
        if error != nil {
            print(error!)
            return
        }
        DispatchQueue.main.sync {
            self.image = UIImage(data: data!)
        }
    }
    task.resume()
}
}

ResultsViewController.swift

class ResultsViewController: UIViewController {

    var getTitle = String()
    var getIngredients = String()
    var getImage = String()

    @IBOutlet weak var recipeDisplay: UILabel!
    @IBOutlet weak var ingredientsDisplay: UITextView!
    @IBOutlet weak var imageDisplay: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        recipeDisplay.text! = getTitle
        ingredientsDisplay.text! = getIngredients
        imageDisplay.image! = getImage
    }
    ...    
}

I'm able to call the downloadImage function in cellForRowAt but can't figure out a way to push that image to the next view controller. There is commented code in didSelectRowAt which returns the error:

"Cannot assign value of type '()' to type 'UIImage'"

Help is appreciated.

miranda
  • 69
  • 9

1 Answers1

0

Replace didSelectRowAt with below,

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
 let Storyboard = UIStoryboard(name: "Main", bundle: nil)
 let resultsVC = Storyboard.instantiateViewController(withIdentifier: "ResultsViewController") as! ResultsViewController

 // Information to be passed to ResultsViewController

 if (tableViewDataSource[indexPath.item] as? Recipe) != nil {
     if isSearching {
         resultsVC.getTitle = filteredData[indexPath.row].title
         resultsVC.getIngredients = filteredData[indexPath.row].ingredients
        // Parse Image
        resultsVC.getImage = filteredData[indexPath.item].image
     } else {
         resultsVC.getTitle = tableViewDataSource[indexPath.row].title
         resultsVC.getIngredients = tableViewDataSource[indexPath.row].ingredients
         // Parse Image
         resultsVC.getImage = self.tableViewDataSource[indexPath.item].image
     }
 }
 // Push to next view
 self.navigationController?.pushViewController(resultsVC, animated: true)

}

and Update ResultsViewController like this,

class ResultsViewController: UIViewController {

    var getTitle = String()
    var getIngredients = String()
    var getImage = String()

    @IBOutlet weak var recipeDisplay: UILabel!
    @IBOutlet weak var ingredientsDisplay: UITextView!
    @IBOutlet weak var imageDisplay: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        recipeDisplay.text = getTitle
        ingredientsDisplay.text = getIngredients
        imageDisplay.downloadImage(from: getImage)
    }
    ...    
}

Also, make sure IBOutlets are connected in the storyboard

Kamran
  • 13,636
  • 3
  • 26
  • 42
  • setting resultsVC.getImage returns the error "Cannot assign value of type 'String' to type 'UIImage'" double checked IBOutlets, they're all correct – miranda Apr 23 '18 at 16:40
  • @miranda what line?? – Kamran Apr 23 '18 at 17:16
  • isn't this image String `self.tableViewDataSource[indexPath.item].image`? – Kamran Apr 23 '18 at 17:17
  • This line `resultsVC.getImage = self.tableViewDataSource[indexPath.item].image` shows the error, with a red line under `image` I'm not sure why, since it's a String – miranda Apr 24 '18 at 16:33
  • I see the problem now. XCode is saying getImage is a UIImage even though I changed it to String. I was working in a duplicate file. Don't know how that happened, but that's why it wasn't registering my updates. This solution works! – miranda Apr 24 '18 at 16:54