按下单元格内的图像时显示 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章