ページ

2009年2月2日月曜日

ファイル名変更(その4)NSTextFieldでESCキーをハンドリングする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

こんどはコントローラの処理を見てみよう。

テキストボックスの方で編集が終わるとコントローラの #endEditFilenameIsCancel: がよびだされる。コードは割愛するが次の処理を行っている。

・ファイル名のチェックする( / とか . が使われていないかどうか)
・ファイル名が変更されたかどうかチェックする(されていなければ何もせず終了)
・キャンセルの場合は、表示を元に戻す
・ファイル名の変更を NSFileManager#movePath:toPath:handler: をつかって実行する
・最後に #setDisable を呼出してテキストボックスをラベル(表示のみ)の状態へ戻す。

こんなんで無事変更ができた。



ところでESCキーを押した時にキャンセルさせるのだが、NSTextFieldを編集中に ESCキーを押すと SimpleViewerが閉じてしまう。どうも NSPanelの performClose: が呼出されてしまっているようだ。テキストボックスのクラスで #keyDown: をオーバーライドしてみたが、呼出されない。

ネットを調べてみると方法があった。
テキストビューなどで押された特殊キーを横取りする - Numata Designed Factory

この記事によると NSTextFieldのdelegateで #control:textView:doCommandBySelector: を実装すればいいようだ。このメソッドの中でセレクタが cancel: のものが ESCキーにあたるのでこの場合にキャンセル処理を行えばいいことがわかる。こんな感じ。

- (BOOL)control:(NSControl *)control
textView:(NSTextView *)textView doCommandBySelector:(SEL)command
{
if (command == @selector(cancel:)) {
[self endEditFilenameIsCancel:YES];
return YES;
}
return NO;
}

このメソッドで YES を返すと該当するキーが無効化される。これによってパネルが閉じることもなくなった。