一、键盘事件
当用户敲击键盘时会发送什么相应事件?首先,windows管理器捕获该事件并转发给活动的应用。该活动应用将该键盘事件转发给键窗口。键窗口转发事件给“活动的”视图。那么那一个视图是活动的呢?每个窗口都有一个称之为firstResponder的outlet,指向windows的一个视图。该视图是该window的一个“活动”视图。例如,当你点击一个文本域,它将称为那个窗口的firstResponder。当用户试图将firtResponder到另一个视图时(通过选项卡或点击另外一个视图),视图在firtResponder出口改变之前,将进行一些检查。首先,将询问可能将变为firtResponder的视图是否接受first-responder状态。若返回NO则意味着该视图对键盘事件不感兴趣。例如,你没法在slider输入字符,所以它会拒绝first-responder状态。如果视图不接受first-responder状态,那么将询问当前first responder视图是否放弃其first responder角色。如果编辑不通过,该视图可以拒绝放弃first-responder状态。例如,如果用户没有敲全电话号码,文本域将拒绝放弃该状态。最后,视图将被告知它变成了first responder。通常,这会改变其外观。
注意,每个窗体都有自己的first responder。一些窗体可能会被打开,但只有键窗体的first responder能够捕获键盘事件。
NSResponder
我们对以下继承自NSResponder的方法感兴趣:
-(BOOL)acceptsFirstRespnder
通过子类重载,若能处理键盘事件则返回YES。
-(BOOL)resignFirstResponder
询问接收者是否愿意放弃first-responder状态。
-(BOOL)becomeFirstResponder
通知接收者在其NSWindow中它已经变为了first responder。
-(void)keyDown:(NSEvent *)theEvent
通知接收者,用户已经按下了一个键。
-(void)keyUp:(NSEvent *)theEvent
通知接收者,用户已经释放了一个键。
-(void)flagsChanged:(NSEvent *)theEvent
通知接收者,用户已经按下或释放了一个修改器键(Shift、Control等等)。
NSEvent
下面是一些关于键盘事件的NSEVent方法
-(NSString *)characters
返回由事件创建的字符。
-(BOOL)isARepeat
如果用户因按下键引发的键事件被重复,就返回YES;如果键事件是新的,就返回NO。
-(unsigned short)keyCode
向引发事件的键盘返回代码。
-(NSUInteger)modifierFlags
返回一个整数bit域,指明影响接收者的修饰符键。
时钟对象有一个target、一个选择器和一个时延,单位为秒。在时延时间到了之后,选择起消息被发送给target。时钟将自己作为一个参数发送给消息。可以设置时钟来周期性地发送消息。
创建一个TutorController类,当用户点击Go按钮时,将创建一个NSTimer实例。时钟将每0.1秒发送一条消息。该触发的方法将检查两个视图是否匹配。如果匹配,将让用户键入新的字母。否则,进程指示器将更新以反映时间的流逝。当按下Stop按钮,时钟将停止。