【问题标题】:pass UIimage from UITableViewCell to next ViewController [duplicate]将 UIimage 从 UITableViewCell 传递到下一个 ViewController [重复]
【发布时间】:2019-03-04 16:59:22
【问题描述】:

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

我有一个类 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 中做了一个 segue (segueDetail):

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

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

【问题讨论】:

    标签: xcode uitableview segue swift4.2


    【解决方案1】:

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

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

    【讨论】:

    • thx 这是一个很好的方法。我做了一点改进,但​​现在出现以下错误:“View Controller”无法访问,因为它没有入口点,也没有通过 -[UIStoryboard instantiateViewControllerWithIdentifier:] 进行运行时访问的标识符。 [9]" - 为什么会这样?
    • @RalfBordé 检查你的故事板。它有一个初始的viewControllerrefer solution
    • 我的 TabBarController 被标记为我的初始 ViewController。我会看看你的参考解决方案。
    • 问题解决了!在我的 DetailViewController 中,我给出了 StoryboardID“SegueDetailViewController”,然后将其放入代码“...(withIdentifier:“SegueDetailViewController”)作为!DetailViewController”。现在它工作正常!
    • @RalfBordé 很高兴为您提供帮助。不要忘记将答案标记为已接受或赞成;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    相关资源
    最近更新 更多