长按时,如何从目标 c 函数而不是 contextMenuInteraction 函数调用 ImagePreviewController: UIViewController?
Posted
技术标签:
【中文标题】长按时,如何从目标 c 函数而不是 contextMenuInteraction 函数调用 ImagePreviewController: UIViewController?【英文标题】:On long press, how do you call an ImagePreviewController: UIViewController from an objective c function instead of a contextMenuInteraction function? 【发布时间】:2021-03-15 19:56:18 【问题描述】:下面的这个函数需要转入一个 ObjC 函数
///this 1st func is in UITableViewController, the others are in UITableViewCell
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? ViewControllerTableViewCell
...
class ViewControllerTableViewCell: UITableViewCell, UIContextMenuInteractionDelegate
func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration?
UIContextMenuConfiguration(identifier: nil, previewProvider:
if self.cc == interaction
let image3 = UIImage(named:"ringy.png")
if let unwrappedImage1 = image3
return ImagePreviewController(image:unwrappedImage1)
else
return nil
else if self.vv == interaction
let image3 = UIImage(named:"green.png")
if let unwrappedImage1 = image3
return ImagePreviewController(image:unwrappedImage1)
else
return nil
else
return nil
)
现在 Obj C 函数
@objc func didLongPress()
///database call
if ab as! Int>0
/// here the part for ringy.png needs to go
else
/////here the part for green.png needs to go
else
print("No data available")
)
ObjC 在覆盖函数中获取句柄
let longPress = UILongPressGestureRecognizer(target: self, action: #selector(didLongPress))
like?.addGestureRecognizer(longPress)
我目前遇到了什么错误:
void 函数中的非 void。也就是说,如果我把代码的 ringy/image3 和 green/image3 部分放在 objC 函数中。
第一次回答后更新
我似乎得到它的答案和一些修改
weak var viewController: UIViewController?
viewController?.present(previewVC, animated: true, completion: nil)
cell.viewController = self ///inside cellForRowAt
我剩下的唯一问题是 ImagePreviewController 的尺寸错误/几乎全屏。它们应该是:
class ImagePreviewController: UIViewController
private let imageView = UIImageView()
init(image: UIImage)
super.init(nibName: nil, bundle: nil)
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
imageView.image = image
view = imageView
let size = UIScreen.main.bounds.size
preferredContentSize = .init(width: size.width, height: size.height/1.55)
required init?(coder: NSCoder)
super.init(coder: coder)
【问题讨论】:
“objC”函数是什么意思?一个用 Objective C 编写的函数(这里没有看到),或者那个用 @objc 标记的“didLongPress” swift 函数(表明它参与了 Objective C 运行时)? @Andreas Oetjen 是的,我的意思是“didLongPress”快速功能。它必须被标记为 objC 才能在覆盖让长按功能中工作。 问题似乎是你想从一个 void 函数返回一个字符串。问题是:即使你改变了返回类型,手势识别器也不会处理它。我假设您想在长按时显示某种“ImagePreviewController”,对吗? 我假设您想在长按时显示某种“ImagePreviewController”,是吗? - 是的,这是完全正确的 你不应该扩展你的问题;如果出现不同的方面,你应该先搜索,如果你没有找到任何东西,你应该问另一个问题。所有这些与维度相关的东西都不再与问题主题匹配了;没有人搜索长按的东西是期待框架大小的东西。 【参考方案1】:如果您想展示一个新的视图控制器,您可以执行 segue(如果您使用故事板)或以经典方式进行:
@objc func didLongPress()
var image:UIImage?
// Some database call? How to get "ab"?
// Maybe you should not use as! in the following check:
if ab as! Int>0
image = UIImage(named:"ringy.png")
else
image = UIImage(named:"green.png")
if let image = image
let previewVC = ImagePreviewController(image:image)
self.present(previewVC, animated: true, completion: nil)
else
print("No data available")
【讨论】:
谢谢。我将补充这个问题(可能应该有)这个类是class ViewControllerTableViewCell: UITableViewCell, UIContextMenuInteractionDelegate
我目前遇到错误Value of type 'ViewControllerTableViewCell' has no member 'present'
这只能在类ViewController中工作吗? ImagePrieviewController 类是 UIViewController
我做了一些搜索,看起来确实是问题所在。也许我可以添加一个协议来与 UIViewController 通信
所以我想我可以让它与你的答案和我在问题中添加的三个小修改一起工作。唯一剩下的问题是获得正确尺寸的预览。由于某种原因,目前预览几乎是全屏的。我在问题中添加了我过去使用 contextMenuInteraction 成功使用的维度以上是关于长按时,如何从目标 c 函数而不是 contextMenuInteraction 函数调用 ImagePreviewController: UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章
React Context API,从子组件设置上下文状态,而不是将函数作为道具传递
对于 iPhone - 但不是 iOS 模拟器 - UIToolbar UIBarButtonItem 将仅在长按时突出显示,而不是在点击时突出显示