将 UIImage 从 UITableViewCell 传递到下一个 ViewController

pass UIimage from UITableViewCell to next ViewController

还有许多其他主题将数据传递给另一个 ViewController - 我知道 - 但我找不到将数据从 UITableViewCell 传递到 [=32] 的解决方案=]UIViewController。这个问题与其他问题不同,这里我必须访问另一个 class 的 UITableViewCell 中的 ImageView。 Segues,为segues做准备其他主题在其他帖子中已充分讨论但不是这个特殊的星座。

我有一个 class UITableViewCell:

class PostCell: UITableViewCell {
...
// networkService is downloading an image 
networkService.downloadImage({ (imageData) in
            let image = UIImage(data: imageData as Data)
...
// image is set to UIImageView
self.postImageView.image = image

在我的 ViewController 中,我这样做是为了转到详细信息ViewController:

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    aktIndex = indexPath.section

    performSegue(withIdentifier: "segueDetail", sender: self)
}

我试过这个:

 let MainStory:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let desVC = MainStory.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController

    desVC.getImage = ???
    self.navigationController?.pushViewController(desVC, animated: true)

详情ViewController:

class DetailViewController: UIViewController {

var getImage = UIImage()
...

我在 xcode 中进行了转接(转接详细信息):

目前我将图像数据存储在 UserDefaults 中,并在 DetailViewController 中再次读取它们。很奇怪,我知道。

我必须从哪里传递数据?在我的 PostCellViewController 中?问题是在我的 ViewController.

中从 PostCell 访问图像数据

tableView(_:didSelectRowAt:)中调用performSegue(withIdentifier: sender:)时,可以传递其中的任何数据或引用。这现在在 prepare(forSegue:sender:) 中可用,您最后一次准备要传递给 segued 的数据 viewController

示例(使用 Segue):

如果 segueDetail 通过情节提要正确连接并且您的用户点击了一行,您可以将 indexPath 发送到 segue,例如:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "segueDetail", sender: indexPath)true)
}

然后在 prepare(forSegue:sender:) 中,根据您的解决方案,您可以准备访问需要传递给下一个 viewController 的所需数据,例如:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vc = segue.destination as? DetailViewController {
        let indexPath = sender as! IndexPath

        let cell = tableView.cellForRow(at: indexPath) as! PostCell
        vc.getImage = cell.postImageView.image
    }
}

示例(手动无 segue):

如果您没有使用 segue 并且用户点击了一行,您可以手动推送 viewController 数据,例如:

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

    let cell = tableView.cellForRow(at: indexPath) as! PostCell
    vc.getImage = cell.postImageView.image

    self.navigationController?.pushViewController(desVC, animated: true)
}

你的 DetailViewController 应该是:

class DetailViewController: UIViewController {    
    var getImage: UIImage?
    //...

注意:这个答案是我能适应给定内容的最佳答案。
它应该可以正常工作,但请不要只是复制粘贴,因为它没有优化(例如,您的用户在下载图像之前点击单元格)。
这只是为了展示基础知识,所以请即兴创作并应用适当的案例处理。