Xamarin.MacでNSTextField内でリターンキーが押された際に処理をする
ナビゲーションに移動
検索に移動
NSTextFieldでリターンキー(エンターキー)が押された際に処理をしたいことも多いと思う。キーボードとマウスをいったりきたりするUIとか止めてほしいと思っている人も多いはず。 ちなみにMacでは宗教上の理由により、キーボードのメイン部分にある大きいのがリターンキーで、テンキーに付いている小さいのがエンターキーと区別するらしぞ。
実装1[編集 | ソースを編集]
リターンキーであれば何も考える必要はない。 リターンキーが押されたり、フォーカスが外れたりすると以下のイベントが順番に発生する。イベント設定はどちらでもいいと思う。
- EditingEndedイベント
- Activatedイベント
public override void AwakeFromNib()
{
base.AwakeFromNib();
textbox.EditingEnded += (sender,e) => Console.WriteLine("EditingEnded");
textbox.Activated += (sender, e) => Console.WriteLine("Activated");
}
実装2[編集 | ソースを編集]
実装1はフォーカスが外れた際に問答無用で処理が走ってしまい微妙に不便だったりする。たとえばウェブブラウザの検索窓などではリターンキーで検索を実行し、フォーカスがはずれただけの場合は何もしないというものが多い。これに対応するにはDoCommandBySelectorを使うとどういう理由で編集を終わろうとしているかを検出できるようだ[1]。
public override void AwakeFromNib()
{
base.AwakeFromNib();
textbox.EditingEnded += (sender,e) => Console.WriteLine("EditingEnded");
textbox.Activated += (sender, e) => Console.WriteLine("Activated");
textbox.DoCommandBySelector = (NSControl control, NSTextView textView, Selector commandSelector) => {
if (commandSelector.Name == "insertNewline:")
{
// ここにリターンキーが押された時の処理を書く
// リターンキーが押された時の終了処理。
// これでEditingEndedイベントが飛ぶ。
textView.PerformSelector(sel:commandSelector, obj:null, delay:-1);
return true;
}
return false;
};
}