【发布时间】:2021-06-03 12:32:28
【问题描述】:
问题是:如何制作通用版本的 UITapGestureRecognizer,以便在我的应用程序中使用。
如果我不想传递任何参数,这很简单:
class ClickListener: UITapGestureRecognizer {
var onClick : (() -> Void)? = nil
}
// MARK: UIView Extension
extension UIView {
func setOnClickListener(action :@escaping () -> Void){
let tapRecogniser = ClickListener(target: self, action: #selector(onViewClicked(sender:)))
tapRecogniser.onClick = action
self.addGestureRecognizer(tapRecogniser)
}
@objc func onViewClicked(sender: ClickListener) {
if let onClick = sender.onClick {
onClick()
}
}
}
正如Sunneet Agrawal 所做的那样。
问题是,我有时需要向这个函数传递参数。 例如,如果我想传递一个对象,我想这样做。然后我可以通过应用程序全局重用这个功能。
我尝试的一切都不起作用,我可以提供一些这样的代码:
class ClickListener<T: Any>: UITapGestureRecognizer {
var onClick : (() -> Void)? = nil
var clickedObject: Any
override init(onClick: (() -> Void), clickedObject: Any, target: self, action: ???){
self.onClick = onClick
self.clickedObject = clickedObject
super.init(target: self, action: ???)
}
}
extension UIView {
func setOnClickListener(action :@escaping () -> Void){
let tapRecogniser = ClickListener(// Init here)
tapRecogniser.onClick = action( // parameter here)
self.addGestureRecognizer(tapRecogniser)
}
@objc func onViewClicked(sender: ClickListener) {
if let onClick = sender.onClick {
onClick(// with parameter passed)
}
}
}
// Then in my VC
UIView.setOnclickListener(action: anyFunction, clickedObject: anyObject)
但我有点迷路了。
【问题讨论】:
-
函数的参数是什么?到点击手势识别器调用的目标/动作?到您添加到自定义手势识别器的“onClick”闭包?两者都有解决方案。
-
向点击手势识别器添加闭包并让点击手势识别器向其目标发送一个动作,然后在手势识别器上调用闭包对我来说似乎很奇怪。
-
我尝试在我的问题中添加更多内容,以便更容易理解。需要明确的是,我希望能够将点击手势识别器添加到 UIViews 并将参数传递给它。例如,我希望能够向传递用户对象的 UIView 添加一个点击函数,然后我可以在函数中使用该对象的特定变量
标签: ios swift uitapgesturerecognizer