Xamarin.MacでNSTextField内でリターンキーが押された際に処理をする

提供: MonoBook
2015年1月30日 (金) 07:30時点における153.220.18.74 (トーク)による版 (ページの作成:「NSTextFieldでリターンキーが押された際に処理をしたいことも多いと思う。 キーボードマウスをいったりきたりするUI...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

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;
            };
        }

関連項目

参考文献