按下单元格内的图像时显示 ViewController [重复]

Posted

技术标签:

【中文标题】按下单元格内的图像时显示 ViewController [重复]【英文标题】:present ViewController when image inside a cell was pressed [duplicate] 【发布时间】:2019-08-06 02:00:28 【问题描述】:

我不知道如何以编程方式呈现 viewController

我已经完成了一个用于点击图像的功能。我现在唯一的问题是如何呈现 viewController。图片在单元格内。

ItemsCell.swift

let tapGesture = UITapGestureRecognizer()

                if let imageStr = obj.image 

                    item.optionImage.kf.setImage(with:URL(string:imageStr))
                    item.optionImage.isUserInteractionEnabled = true
                    tapGesture.addTarget(self, action: #selector(tappedImage))
                    item.optionImage.addGestureRecognizer(tapGesture)

                 else 

                    item.optionImage.image = nil

                

功能:

@objc func tappedImage() 

        print("image tapped")

//        let storyboard = UIStoryboard(name: "Main", bundle: nil)
//        let controller = storyboard.instantiateViewController(withIdentifier: "AssetsViewController")

//        controller.present(controller, animated: true, completion: nil)  
    

【问题讨论】:

你试过self.present(controller, animated: true, completion: nil)吗? 【参考方案1】:

使用Post Notification

class VC: UIViewController 
    override func viewDidLoad() 
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(presentVC(_:)), name: NSNotification.Name("PresentVCNotificationName"), object: nil)
    

    @objc
    func presentVC(_ notification: Notification) 
        let cell = notification.object as? YourCell

        let storyboard = UIStoryboard(name: "Your Storyboard Name", bundle: Bundle.main)
        let vc = storyboard.instantiateViewController(withIdentifier: "Your Storyboard ID")
        self.present(vc, animated: true, completion: nil)
    

    deinit 
       NotificationCenter.default.removeObserver(self)
    



class Cell: UITableViewCell 

   @objc func tappedImage() 

      NotificationCenter.default.post(name: NSNotification.Name("PresentVCNotificationName"), object: self)
   

【讨论】:

请注意,问题指出表格视图单元格中的图像意味着tappedImage方法在单元格中。 使用Post Notification,查看编辑。 一个单元格永远不应该知道它的索引路径。发送带有通知的单元格要好得多。然后视图控制器可以从单元格中获取它需要的任何信息,包括询问表格视图视图单元格来自哪个索引路径。但由于该问题已作为重复问题关闭,您不妨删除您的答案。 可以在tableView(_:cellForRowAt:)函数上设置indexPath 但正如我所说,一个单元格永远不应该被赋予它的索引路径。它可以改变和错误。【参考方案2】:

在界面构建器中点击您要显示的 viewController 并确保您定义了 Storyboard Id。为该视图控制器创建一个类,并确保您有一个到应该显示该图像的UIImageView 的出口。还要确保你的班级有一个UIImage 类型的成员。

// Assumed this class has Storyboard Id of: ImageViewerViewController
class ImageViewerViewController: UIViewController 
   var imageView: UIImageView! // outlet from IB
   var image: UIImage!

   override func viewDidLoad() 
      imageView.image = image;
   

在包含表格的视图控制器中: 类 MainViewController: UIViewController . . . // UITableViewDelegate func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 让 cell = self.tableView.dequeueReusableCell(withIdentifier: ImageCell) as! YourC ImageCell ellClass cell.containerVc = 自我 返回单元格

在单元格视图中:

class ImageCell: UITableViewCell 
  weak var containerVc: UIViewController!

  @objc func tappedImage() 
    print("image tapped")

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "ImageViewerViewController") as! ImageViewerViewController
    controller.image = item.optionImage.image
    containerVc.present(controller, animated: true, completion: nil)  
  

【讨论】:

请注意,问题指出表格视图单元格中的图像,这意味着tappedImage 方法在单元格中。 是的,这就是为什么在tappedImage() 之前我明确指出它在单元格视图中。 @rmaddy,这个答案完全回答了原始发帖人的问题。

以上是关于按下单元格内的图像时显示 ViewController [重复]的主要内容,如果未能解决你的问题,请参考以下文章

选择单元格时显示 UIPickerView

uitableview 中的单元格图像在滚动时显示备份

如何在选择 tableView 的行单元格(作为集合视图单元格)时显示视图控制器?

Nativescript-vue 在点击事件时显示图像

重叠表格单元格内容[关闭]

更改在 Android 中按下概览按钮时显示的 Flutter 图标