FirstResponder方法来自哪里?

时间:2010-01-21 21:06:25

标签: objective-c macos first-responder

我正在查看Apple提供的IKImageDemo,旋转圆滑块链接到FirstResponder中的setRotation:方法。但是,项目中的任何对象似乎都没有这样的方法,但代码仍然有效。

我正在尝试将此复制到我自己的项目中,并且我的FirstResponder没有setRotation:方法,因此我不确定它的位置。谷歌一直没有帮助......

感谢。

3 个答案:

答案 0 :(得分:1)

嗯,应用程序中的第一个响应者碰巧是IKImageView的一个实例。 IKImageView响应setRotation:选择器(通过将respondsToSelector:@selector(setRotation :)传递给任何IKImageView实例可以看到),虽然我无法在文档中找到它提到的setRotation:method

答案 1 :(得分:0)

First Responder方法并不神奇。将消息发送给第一响应者时发生的情况是,应用程序的当前第一响应者(通常是聚焦视图/控件)被询问是否实现该方法。如果是,则调用该方法。如果没有,则询问链上的下一个响应者,依此类推,直到达到顶级(NSApplication实例)。该对象实际上必须实现调用它的方法,它不能只是声明它。

在这种情况下,IKImageView-setRotation:实现为私有方法。这意味着该方法存在(这就是IKImageView接受发送给第一响应者的消息的原因),但未记录或支持其使用。看起来很奇怪Apple会使用私有方法发布一个例子,但是你去了。肯定的情况是,当支持使用时,有时候方法会被意外地排除在公共标题之外,但是除非Apple的某个人明确告诉您可以使用私有方法,否则通常明智的做法是避免使用私有方法。

您可以使用class-dump.

从二进制文件生成Objective-C对象的所有方法的标头,包括私有方法

IKImageView有一个公共方法-setRotationAngle:,如果你想改变轮换,这可能就是你的选择。

答案 2 :(得分:0)

我找到了一种解决这种烦恼的方法。即使在最初的Apple示例中,一旦在First Responder中删除setRotation的绑定,除非执行此操作,否则无法将其放回:只需对First Responder使用Attributes Inspector并添加用户定义的操作“setRotation:”with输入“id”。现在,即使是第一个响应者绑定setRotation的黄色三角形:在Apple示例中也会消失,并且它也显示在我自己的IKImageView实例中。