4

Xcode 4 で MonoMac を理解しようとしていますが、ほとんどのことがうまくいくようです。ただし、 windowWillClose: を機能させる方法がわかりません。

追加した

[Export ("windowWillClose:")]
    void windowWillClose(NSNotification notification)
    {
        Environment.Exit(0);    
    }

MainWindow.cs に追加し、MainWindow をウィンドウのデリゲートにしました。(MainWindowController をデリゲートにしようとしましたが、うまくいきませんでした。)

ただし、ウィンドウを閉じると、デリゲート メソッドが呼び出されません。

私は何を見落としていますか?

4

2 に答える 2

1

写真付き: http://www.netneurotic.net/Mono/MonoMac-windowWillClose.html

ここでの秘訣は、Environment.Exit() を呼び出して、他の .NET アプリケーションと同様にアプリケーションを終了するメソッドを作成することです。

もう 1 つのトリックは、Cocoa オブジェクトが生きているときは Environment.Exit() が機能しないことに注意することです。しかし NSApplication.SharedApplication.Terminate(this) は機能します。そのようにエラーコードを返す方法がわかりません。

Cocoa、つまり MonoMac は、「デリゲート」を使用して、あるオブジェクトが別のオブジェクトに何かが起こったときに反応できるようにします。この概念を使用して、メイン ウィンドウが閉じるときに Terminate() を呼び出します。

Cocoa オブジェクトには、他のオブジェクトへのポインターのように見える「アウトレット」があります。これが技術的に正しい説明かどうかはわかりません。それは問題ではありません。アウトレットの 1 つは、ウィンドウが閉じられたときに呼び出すメソッドを含むオブジェクトに設定する「デリゲート」です。したがって、メイン ウィンドウのデリゲート アウトレットをオブジェクトに設定する必要があります。

MainWindow.cs で定義されている MainWindow クラスをメイン ウィンドウのデリゲートとして使用します。これは、オブジェクトを独自のデリゲートなどとして使用していることを意味していると思います。それはまだ動作します。

MainWindow をメイン ウィンドウのデリゲートにして、メイン ウィンドウのクローズに対応するには、次の手順に従います。

  1. MainWindow.xib をダブルクリックして Xcode を開きます。

  2. Xcode で、メイン ウィンドウを見つけます。窓のように見える大きなものです。

写真1:「ウィンドウ」と書かれた大きなものがメインウィンドウです。

  1. ウィンドウのタイトル バーを右クリックして、ウィンドウのアウトレットを表示します。

「デリゲート」と呼ばれる 1 つのアウトレットが表示されます。

写真 2: 「アウトレット」の 1 つが「デリゲート」です。

  1. 「Object Library」とその中の青いボックスを見つけます。青いボックスはオブジェクトです。

写真 3: 青いボックスはオブジェクトです。

  1. 青いボックスを、ウィンドウの左側にあるアイコンのある灰色のものにドラッグします。

図 4: 青いボックスはウィンドウ アイコンの下にあります。

  1. 青いボックスを「MainWindow」オブジェクトにします。青いボックスをクリックして、そのクラスを「MainWindow」に変更します。

図 5: 青いボックスのクラス名を更新します。

  1. コントロール キーを押しながら、ウィンドウのタイトル バーから青いボックスにドラッグします。次に、表示されるメニューで「委任」オプションを選択します。

写真 6: Ctrl キーを押しながらドラッグすると表示されるメニュー。

MainWindow オブジェクトがメイン ウィンドウのデリゲートになりました。これは、ウィンドウに起こったことに反応できることを意味します。

  1. 次のコードを MainWindow.cs に追加します。

    [Export("windowWillClose:")] public void WindowWillClose(NSNotification 通知) { Console.WriteLine("windowWillClose:"); NSApplication.SharedApplication.Terminate(これ);
    }

[Export ("windowWillClose:")] ステートメントは、次のメソッド宣言が、発表された Objective-C メソッドと同等の C# であることをコンパイラ (おそらくコンパイラですが、技術的には他のユーティリティが行う可能性があります) に伝えます。メソッドには別の実際の名前を付けることができますが、十分に簡単に識別できるように、十分に類似した名前にする必要があります。通常、最初の文字を大文字に変更して、C# スタイルに準拠させます。

  1. アプリケーションをコンパイルし、タイプミスをすべて修正してから実行します。ウィンドウを閉じてみてください。アプリケーションが終了します。

そうでない場合は、ここに記載されているすべての手順を繰り返します。

于 2013-08-29T22:17:53.947 に答える
0

MainWindowControllerから継承する別の/内部クラスを作成しNSWindowDelegate、メソッドをオーバーライドしWillClose (NSNotification notification)て、ウィンドウデリゲートとして設定することをお勧めします。ジョブが完了しました。

コード:

    class MyDelegate:NSWindowDelegate
    {
        public override void WillClose (NSNotification notification)
        {

        }
    }

AwakeFromNib メソッドにこれを追加します。

Window.Delegate = new MyDelegate();
于 2011-10-12T18:18:39.880 に答える