如何将图像从 TableViewCell 传递到 UIImage

Posted

技术标签:

【中文标题】如何将图像从 TableViewCell 传递到 UIImage【英文标题】:How to pass Image from from TableViewCell to UIImage 【发布时间】:2016-11-26 07:07:19 【问题描述】:

My segues我想弄清楚是否有办法将我选择的单元格中的图像传递给一个完全不同的视图控制器中的新UIImageView。我不完全理解 segue 是如何工作的,经过数小时的审议,我还没有完全找到解决方案。我已经能够在tableview 中显示我的图像,但我想将所选图像发送到UIImageView 以获得更大的图片视图。我目前为此有 2 个 VC。其中第一个称为TableView

import UIKit

class TableView: UITableViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate 


    @IBAction func toImage(_ sender: Any) 
        performSegue(withIdentifier: "ImageView", sender: self)
    

    // Properties
    var imagesDirectoryPath:String!
    var images:[UIImage]!
    var titles:[String]!

    @IBAction func choosePhoto(_ sender: AnyObject) 
        let imagePicker = UIImagePickerController()
        if UIImagePickerController.isSourceTypeAvailable(.camera)
            imagePicker.sourceType = .photoLibrary
            print("Library selected")
        else
            print("No cam here!")
        

        present(imagePicker, animated: true, completion: nil)
        imagePicker.delegate = self

    

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self

        self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier:"CellID")

        images = []

        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        // Get the Document directory path
        let documentDirectorPath:String = paths[0]
        // Create a new path for the new images folder
        imagesDirectoryPath = documentDirectorPath + "/ImagePicker"
        var objcBool:ObjCBool = true
        let isExist = FileManager.default.fileExists(atPath: imagesDirectoryPath, isDirectory: &objcBool)
        // If the folder with the given path doesn't exist already, create it
        if isExist == false
            do
                try FileManager.default.createDirectory(atPath: imagesDirectoryPath, withIntermediateDirectories: true, attributes: nil)
            catch
                print("Something went wrong while creating a new folder")
            
        
    


    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func refreshTable()
        do
            images.removeAll()
            titles = try FileManager.default.contentsOfDirectory(atPath: imagesDirectoryPath)
            for image in titles
                let data = FileManager.default.contents(atPath: imagesDirectoryPath + "/\(image)")
                let image = UIImage(data: data!)
                images.append(image!)
            
            self.tableView.reloadData()
        catch
            print("Error")
        
    


    //MARK: UIImagePickerControllerDelegate Protocol
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) 

        // Save image to Document directory
        var imagePath = Date().description
        imagePath = imagePath.replacingOccurrences(of: " ", with: "")
        imagePath = imagesDirectoryPath + "/\(imagePath).png" //this would change depending on the name of the image
        let data = UIImagePNGRepresentation(image)
        _ = FileManager.default.createFile(atPath: imagePath, contents: data, attributes: nil)
        dismiss(animated: true)  () -> Void in
            self.refreshTable()
        
    

    //MARK: UITableView DataSource
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell:UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "CellID")

        cell?.imageView?.image = images[indexPath.row]
        cell.textLabel?.text = titles[indexPath.row]
        return cell
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return images.count
    

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        performSegue(withIdentifier: "ImageView", sender: images[indexPath.row])
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        var secondVC : ImageView = segue.destination as! ImageView

        //secondVC.fullView = imagesDirectoryPath[IndexPath.row]
    




这是我的ImageView,我希望我的单元格中的图像出现在这里。

import UIKit

class ImageView:ViewController

    @IBOutlet var fullView: UIImageView!
    var selectedImage = UIImage()
    override func viewDidLoad() 
        super.viewDidLoad()
        self.fullView.image = self.selectedImage //Assign selected Image here




    
    //segue via a button
    @IBAction func toTable(_ sender: Any) 
        performSegue(withIdentifier: "TableView", sender: self)

    



那么有什么方法可以将现有图像传递给另一个 VC 中的 UIImageView。我梳理了整个谷歌,但我似乎无法弄清楚。

谢谢!

【问题讨论】:

检查你的类声明继承。 class ImageViewController : UIViewController ... 我将 ImageView 更改为 SecondViewController 并添加了 UIViewController 而不是 ViewController,但仍然出现相同的错误。 查看storyboard文件中vc的nib上的类声明。它也需要是SecondViewController 所有声明看起来都正确。我仔细检查了所有的标识符,但它仍然给我同样的错误。如果您想查看代码的任何屏幕截图,请告诉我。 【参考方案1】:

在您的故事板文件中,确保在 segue 目标的笔尖上将自定义类设置为 SecondViewController

【讨论】:

是的,当我将 ImageView 的名称更改为 SecondViewController 时,我更改了它。错误指向此特定行:' let secondVC : SecondViewController = segue.destination as!第二视图控制器 ' . 在该处和控制台中放置断点po type(of: segue.destination) 它告诉我它“无法将 'Lab9.ViewController' (0x102682bc0) 类型的值转换为 'Lab9.SecondViewController' (0x102682af8)。” ViewController 是一个不同的视图控制器,我不明白为什么它会出现在这里。 您的故事板文件中是否有多个转场? 呜呼。非常感谢!我不知道没有必要回到以前的观点。现在我终于可以睡觉了!

以上是关于如何将图像从 TableViewCell 传递到 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 tableviewcell 传递到另一个 viewcontroller

无法使用 Swift 将图像 url 从 JSON(API) 绑定到 tableviewcell

Swift iOS - 如何将直接从 TableViewCell 的子类中获取的值传递给 TableView 的 didSelectRow?

如何通过单击swift4中的addImage按钮将图像一张一张添加到tableviewcell中

如何在单个 TableViewcell 的不同部分有不同的图像,将集合视图放置在 tableviewCell 内

如何在 iOS TableViewCell 上实现圆角图像?