Swift 2:UIPinchGestureRecognizer 中的选择器:如何从另一个 class 访问函数
Swift 2: Selector in UIPinchGestureRecognizer: How to access func from another class
我在 Swift 上关注 this class 并构建应用程序。
在视频的 43:30 处,讲师教授如何设置 UIPinchGestureRecognizer
,它在其选择器中从另一个文件中获取函数。
这是讲师使用的代码:
@IBOutlet weak var faceView: FaceView! {
didSet {
faceView.addGestureRecognizer(UIPinchGestureRecognizer(target: faceView, action: #selector(FaceView.changeScale(_:))))
updateUI()
}
}
我得到 2 个错误:
Expected expression in list of expressions,
和:
Expected ',' separator.
我曾尝试将 #selector
更改为 Selector
,但没有成功。
函数changeScale
:
func changeScale(recognizer: UIPinchGestureRecognizer)
{
switch recognizer.state {
case .Changed, .Ended:
scale *= recognizer.scale //scale is the displayed image scale
recognizer.scale = 1.0
default:
break
}
如果我用引号将 Selector
参数括起来,应用程序会在我捏合时崩溃,并出现以下错误:
unrecognized selector sent to instance.
从上面的评论中可以看出,Xcode版本是7.2,#selector
语法是在Xcode7.3中引入的,因此这里不可用。这只是意味着您应该能够使用 "old" Selector
语法。
不同之处在于,您只需将字符串传递给 Selector
和您的函数名称,然后将 :
传递给函数需要的每个参数。您需要一个参数(recognizer
),因此在您的情况下,字符串如下所示:
"changeScale:"
所以你会使用:
Selector("changeScale:")
你最终得到:
@IBOutlet weak var faceView: FaceView! {
didSet {
faceView.addGestureRecognizer(UIPinchGestureRecognizer(target: faceView, action: Selector("changeScale:")))
}
}
如您所见,这很容易出错...一个打字错误!这就是为什么新的 #selector
语法是一个很好的改进……抱歉……不想把它擦进去。
希望对您有所帮助。
我是 运行 Xcode 8.1(8B62) 和 iPhone MacBook Air(版本 100.11.6)5 模拟器
这是我使用的有效代码
faceView.addGestureRecognizer(UIPinchGestureRecognizer(target:faceView,
action:#selector(FaceView.changeScale(recognizer:))))
当你捏脸的时候,一定要点击"Option + Left Click + Movement on your mousepad"。我犯了一个错误,只是按 "Option + Movement on the mousepad",但它不起作用。
希望对您有所帮助。
我在 Swift 上关注 this class 并构建应用程序。
在视频的 43:30 处,讲师教授如何设置 UIPinchGestureRecognizer
,它在其选择器中从另一个文件中获取函数。
这是讲师使用的代码:
@IBOutlet weak var faceView: FaceView! {
didSet {
faceView.addGestureRecognizer(UIPinchGestureRecognizer(target: faceView, action: #selector(FaceView.changeScale(_:))))
updateUI()
}
}
我得到 2 个错误:
Expected expression in list of expressions,
和:
Expected ',' separator.
我曾尝试将 #selector
更改为 Selector
,但没有成功。
函数changeScale
:
func changeScale(recognizer: UIPinchGestureRecognizer)
{
switch recognizer.state {
case .Changed, .Ended:
scale *= recognizer.scale //scale is the displayed image scale
recognizer.scale = 1.0
default:
break
}
如果我用引号将 Selector
参数括起来,应用程序会在我捏合时崩溃,并出现以下错误:
unrecognized selector sent to instance.
从上面的评论中可以看出,Xcode版本是7.2,#selector
语法是在Xcode7.3中引入的,因此这里不可用。这只是意味着您应该能够使用 "old" Selector
语法。
不同之处在于,您只需将字符串传递给 Selector
和您的函数名称,然后将 :
传递给函数需要的每个参数。您需要一个参数(recognizer
),因此在您的情况下,字符串如下所示:
"changeScale:"
所以你会使用:
Selector("changeScale:")
你最终得到:
@IBOutlet weak var faceView: FaceView! {
didSet {
faceView.addGestureRecognizer(UIPinchGestureRecognizer(target: faceView, action: Selector("changeScale:")))
}
}
如您所见,这很容易出错...一个打字错误!这就是为什么新的 #selector
语法是一个很好的改进……抱歉……不想把它擦进去。
希望对您有所帮助。
我是 运行 Xcode 8.1(8B62) 和 iPhone MacBook Air(版本 100.11.6)5 模拟器
这是我使用的有效代码
faceView.addGestureRecognizer(UIPinchGestureRecognizer(target:faceView,
action:#selector(FaceView.changeScale(recognizer:))))
当你捏脸的时候,一定要点击"Option + Left Click + Movement on your mousepad"。我犯了一个错误,只是按 "Option + Movement on the mousepad",但它不起作用。
希望对您有所帮助。