快速将 UIImage 推送到下一个视图控制器

Posted

技术标签:

【中文标题】快速将 UIImage 推送到下一个视图控制器【英文标题】:Pushing UIImage to next view controller in swift 【发布时间】:2018-04-23 15:20:45 【问题描述】:

我已成功将图像解析为cellForRowAt,但现在需要为didSelectRowAt 显示ResultsViewController 中的食谱,但遇到了问题。

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

我可以在cellForRowAt 中调用downloadImage 函数,但无法找到将该图像推送到下一个视图控制器的方法。 didSelectRowAt 中有注释代码返回错误:

“无法将类型 '()' 的值赋给类型 'UIImage'”

感谢您的帮助。

【问题讨论】:

可以通过同样的方法传递URL并显示出来。 ***.com/questions/46199203/… 它不起作用。它返回我上面显示的错误,你可以看到我在注释掉的代码中使用了相同的方法 不要分配图像对象,您可以在字符串中分配 URL 现在您分配的方法不是图像 【参考方案1】:

用下面的替换didSelectRowAt

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)

并像这样更新ResultsViewController

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

另外,请确保 IBOutlets 已连接到 storyboard

【讨论】:

设置resultsVC.getImage返回错误“无法将'String'类型的值分配给'UIImage'类型”仔细检查IBOutlets,它们都是正确的 @miranda 什么线路?? 这不是图片字符串self.tableViewDataSource[indexPath.item].image吗? 这一行resultsVC.getImage = self.tableViewDataSource[indexPath.item].image 显示错误,image 下有一条红线我不知道为什么,因为它是一个字符串 我现在看到了问题。 XCode 说 getImage 是 UIImage,即使我将其更改为 String。我在一个重复的文件中工作。不知道这是怎么发生的,但这就是为什么它没有注册我的更新。此解决方案有效!

以上是关于快速将 UIImage 推送到下一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何将其他视图控制器推送到 NavigationController 但保留 TabBar?

我可以将视图控制器推送到后端的 UINavigationController

如何将视图控制器推送到 UISplitViewController

将 UIImage 从 photopicker 传递到以前的 ViewController

如何将多个视图控制器推送到导航控制器上

将视图控制器推送到另一个视图控制器时如何处理 UIParallaxDimmingView?