Swift 中的手动 GestureRecognizer 处理程序不能有参数?
Manual GestureRecognizer handler in Swift can't have arguments?
如果我通过 InterfaceBuilder 创建一个 GestureRecognizer 处理程序,我得到一个如下所示的方法:
@IBAction func Tap(tap: UITapGestureRecognizer) {
var touchLocation = tap.locationInView(self.view)
imageView.transform.tx = touchLocation.x
imageView.transform.ty = touchLocation.y
}
//works great
如果我手动创建一个 GestureRecognizer,我必须创建一个没有参数的函数,如下所示:
let tap = UITapGestureRecognizer()
override func viewDidLoad() {
super.viewDidLoad()
let imageSize = CGSize(width: 100, height: 100)
var iView = UIImageView(frame: CGRect(origin: CGPoint(x: 100, y: 100), size: imageSize))
self.view.addSubview(iView)
let image2 = UIImage(named: "square.png");
iView.image = image2
iView.userInteractionEnabled = true
iView.addGestureRecognizer(tap)
tap.addTarget(self, action: "Tap")
}
func Tap( //why can't I put an argument in here?// ){
let tapAlert = UIAlertController(title: "Tap Pressed", message: "You just tapped", preferredStyle: .Alert)
tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
self.presentViewController(tapAlert, animated: true, completion: nil)
}
//works but I've lost access to the sending object
如果我向 Tap 处理程序添加一个参数
func Tap(sender: UITapGestureRecognizer){
}
//crashes: [tapHandler]: unrecognized selector sent to instance
,它在 Tap 上崩溃。我更希望有一个可以访问发件人对象的方法。有没有一种方法可以手动创建 GestureRecognizer 处理程序并访问发送者对象,就像您通过 Interface Builder 那样?
选择器名称是 Swift 从 Objective C 继承而来的。在 Objective C 中,具有单个参数的选择器的名称为 selector:
与 selector
相反,这意味着 - 没有参数。将 addTarget
中的操作名称从 Tap
更改为 Tap:
然后它应该可以工作。
如果我通过 InterfaceBuilder 创建一个 GestureRecognizer 处理程序,我得到一个如下所示的方法:
@IBAction func Tap(tap: UITapGestureRecognizer) {
var touchLocation = tap.locationInView(self.view)
imageView.transform.tx = touchLocation.x
imageView.transform.ty = touchLocation.y
}
//works great
如果我手动创建一个 GestureRecognizer,我必须创建一个没有参数的函数,如下所示:
let tap = UITapGestureRecognizer()
override func viewDidLoad() {
super.viewDidLoad()
let imageSize = CGSize(width: 100, height: 100)
var iView = UIImageView(frame: CGRect(origin: CGPoint(x: 100, y: 100), size: imageSize))
self.view.addSubview(iView)
let image2 = UIImage(named: "square.png");
iView.image = image2
iView.userInteractionEnabled = true
iView.addGestureRecognizer(tap)
tap.addTarget(self, action: "Tap")
}
func Tap( //why can't I put an argument in here?// ){
let tapAlert = UIAlertController(title: "Tap Pressed", message: "You just tapped", preferredStyle: .Alert)
tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
self.presentViewController(tapAlert, animated: true, completion: nil)
}
//works but I've lost access to the sending object
如果我向 Tap 处理程序添加一个参数
func Tap(sender: UITapGestureRecognizer){
}
//crashes: [tapHandler]: unrecognized selector sent to instance
,它在 Tap 上崩溃。我更希望有一个可以访问发件人对象的方法。有没有一种方法可以手动创建 GestureRecognizer 处理程序并访问发送者对象,就像您通过 Interface Builder 那样?
选择器名称是 Swift 从 Objective C 继承而来的。在 Objective C 中,具有单个参数的选择器的名称为 selector:
与 selector
相反,这意味着 - 没有参数。将 addTarget
中的操作名称从 Tap
更改为 Tap:
然后它应该可以工作。