前々回まででホットキー設定 UIのひな形ができたが、変更してもシステムへは反映していなかった。今回はその実装を行う。
まず HotkeyTextView で変更があったことをコントローラへ通知する必要がある。今回は自前のターゲット/アクションを用意しよう。
まず HotkeyTextViewへ target と action プロパティを用意する。
HotkeyTextView.h
@interface HotkeyTextView : NSTextView {
:
id _target;
SEL _action;
}
:
@property (retain) id target;
@property (retain) SEL action;
@end
次にホットキーが変更された場合に target に対して action メソッドを呼び出す処理を用意する。これは keyDown: の中がいいだろう。
HotkeyTextView.m
- (void)keyDown:(NSEvent *)theEvent
{
:
// 確定処理
if (_hotkey.modifier != modifier || _hotkey.code == keycode) {
_hotkey.modifier = modifier;
_hotkey.code = keycode;
if (self.target && [self.target respondsToSelector:self.action]) {
[self.target performSelector:self.action withObject:self.hotkey];
}
}
[self redraw];
[self endEdit];
}
前回は同じキーが押された場合の処理が抜けていたのでついでに加えておいた(実際にはホットキーが起動するため、イベントはとれないのだが)。
必要な情報を Hotkey へ格納した後、target / action の存在チェックを行い、メッセージを投げる。引数として Hotkeyを渡しておく。
一方、使う側はこんな感じ。
AppController.m
- (void)awakeFromNib
{
_hotkey_register = [HotkeyRegister sharedRegister];
Hotkey *hotkey;
hotkey = [[[Hotkey alloc] init] autorelease];
:
_text1.hotkey = hotkey;
_text1.target = self; <--追加
_text1.action = @selector(changeHotkey:); <--追加
:
変更時に呼び出される changeHotkey: でシステムへの反映を行う。
- (void)changeHotkey:(id)sender
{
NSLog(@"changeHotkey was called: %@", sender);
[_hotkey_register registHotkey:sender];
}
- [HotkeyRegister registHotkey] は直前のホットキーを取り消した(unregist)後に、新しいキーを登録するように実装してある。
さて実行してみよう。デバッグコンソールで動作を追って見る。
「⌥⌘P」を「⌃⌥⌘⇧Space」へ変更してみよう。
[Session started at 2009-07-11 06:10:45:24 +0900.]
:
2009-07-11 06:10:34.376 Hotkey[1062:10b] changeHotkey was called: <Hotkey: 0x1559a0>
↑ホットキーを変更すると changeHotkey: が呼び出された。
2009-07-11 06:10:34.416 Hotkey[1062:10b] unregistHotkey: <Hotkey: 0x1559a0>
↑直前のキーが取り消され
2009-07-11 06:10:34.434 Hotkey[1062:10b] registHotkey: keyid=2, modifier=1b00, code=31, ref=1aefe0,
target=<AppController: 0x151730>, action=keyDown:
↑新しいキーが登録された
2009-07-11 06:10:34.464 Hotkey[1062:10b] {(
<Hotkey: 0x155760>,
<Hotkey: 0x1559a0>
)}
2009-07-11 06:10:38.954 Hotkey[1062:10b] keyDown: keycode=31 [⌃⌥⌘⇧Space]
↑試しに新しいホットキーを押すとちゃんと反応した。
2009-07-11 06:10:44.979 Hotkey[1062:10b] keyDown: keycode=25 [⌥⌘L]
サンプル:HotKey-4.zip