从UITableViewCell传递UIimage到下一个ViewController

时间:2019-03-04 16:59:22

标签: xcode uitableview segue swift4.2

还有很多其他将数据传递到另一个ViewController的主题-我知道-但是我找不到将数据从 UITableViewCell 传递到 UIViewController 的解决方案。这个问题与其他问题不同,在这里我必须访问另一类UITableViewCell中的ImageView。塞格斯,为塞格斯做准备,其他话题在其他帖子中已经讨论得足够多了,但是这个特殊的星座却没有。

我有一个类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中,我执行此操作以转到DetailViewController:

 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)

DetailViewController:

class DetailViewController: UIViewController {

var getImage = UIImage()
...

我在xcode(segueDetail)中进行了segue: enter image description here

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

我必须从哪里传递数据?在我的 PostCell 还是 ViewController 中?问题是可以从ViewController中的PostCell访问图像数据。

1 个答案:

答案 0 :(得分:1)

tableView(_:didSelectRowAt:)中,当您调用performSegue(withIdentifier: sender:)时,可以传递任何数据或引用。现在可以在prepare(forSegue:sender:)中使用它了,这是您准备将数据传递给已定购的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且用户点击了一行,则可以手动推送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?
    //...

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