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",但它不起作用。

希望对您有所帮助。