cocoa中FirstResponder解释

     当用户使用键盘输入时候,相对应的事件就会在应用程序中进行传递。窗口管理器会获取事件,并转发给当前激活的程序。当前激活的程序就会把键盘事件发送给KeyWindow。而KeyWindow又将事件转发给“激活”的视图(NSView)。那么哪个view是“激活”的呢?每一个窗口都有一个名为firstResponder的Outlet,它指向了这个窗口的一个View,或者是某一个控件(NSButton,NSTextField,这两个是从NSView继承下来的,你也可以把它当作特殊的view)等。那么这个view也就是该窗口"激活"的view。 举个例子:当一个NSView存在以下几种控件的时候:NSTextField,NSButton,NSMatrix,一个自定义的NSView。如下图所示:

cocoa中FirstResponder解释_第1张图片

当你点击这其中某一个控件,比如点击NSTextField,那么NSTextField那个对象就会成为这个窗口的firstResponder。点击MyView,那么myView就可以成为firstResponder

当用户尝试通过Tab键或点击另一个view来改变窗口的firstResponder时,会有一系列步骤作用在这个view上。过程如下:

首先,在成为firstRespondr之前,该view会被询问是否接受成为firstResponder。如果返回NO的话,说明这个View对键盘或者鼠标事件不敢兴趣。例如你不能对一个滚动条控件进行键盘输入。所以它会拒绝成为firstResponder。如果一个view要接受成为firstResponder,那么之前已经成为firstResponder的那个view会被询问是否愿意放弃成为firstResponder。如果那个view还没完成键盘事件,它是不会放弃firstResponder的角色的。比如说:用户在NSTextField控件里面没有完成完整的输入,你此时切换FirstResponder的话,NSTextField它会拒绝放弃firstResponder的,直到自己完成编辑操作。

每一个窗口都有自己的firstResponder,可能会有多个窗口同时被打开。但是只有KeyWindow的firstResponder才会获取键盘事件。

有几个重要的方法:

-(BOOL) acceptsFirstResponder

重写的这个方法,要想去处理键盘事件就返回YES

-(BOOL)resignFirstResponder

询问是否放弃firstResponder。返回YES则同意放弃。返回NO,表示不同意放弃。

-(BOOL)becomeFirstResponder

通知接受者成为窗口的firstResponder


你可能感兴趣的:(cocoa中FirstResponder解释)