1

私はOSX開発に非常に慣れていません。これを私の最初のアプリと考えてください。メインウィンドウのボタンをクリックしたときにシートを表示したい。ニブ使ってる

以下は.hファイルの私のコードです

#import <Foundation/Foundation.h>
#import "WebKit/Webkit.h"

@interface MainViewObject : NSObject
- (IBAction)accountButtonPressed:(id)sender;
- (IBAction)cancelSheetButtonPressed:(id)sender;

.m ファイルは次のとおりです。

#import "MainViewObject.h"
@implementation MainViewObject

- (IBAction)accountButtonPressed:(id)sender {
    [NSApp beginSheet:self.accountSheet
   modalForWindow:[mainWindowView window]
    modalDelegate:nil
   didEndSelector:nil
      contextInfo:nil];

[NSApp runModalForWindow:self.accountSheet];

[NSApp endSheet:self.accountSheet];
[self.accountSheet orderOut:self];
}

- (IBAction)cancelSheetButtonPressed:(id)sender {
// Return to normal event handling
[NSApp endSheet:self.accountSheet];
// Hide the sheet
[self.accountSheet orderOut:sender];
}

アプリを実行すると、次のような結果が得られます。

http://i.imgur.com/DzJJ6.png

私は立ち往生しており、これで何が悪いのかわかりません。シートを取得できず、アプリを閉じることさえできません。私はインターネット上のいくつかの例を参照しました。

4

1 に答える 1

1
- (IBAction)accountButtonPressed:(id)sender {
    [NSApp beginSheet:self.accountSheet
   modalForWindow:[mainWindowView window]
    modalDelegate:nil
   didEndSelector:nil
      contextInfo:nil];

    [NSApp runModalForWindow:self.accountSheet];

    [NSApp endSheet:self.accountSheet];
    [self.accountSheet orderOut:self];

}

うわー、それを見ると、スクリーンショットがそのままのように見えても不思議ではありません。

一度に 1 行ずつ見ていきましょう。[アカウント] ボタンをクリックすると、次の 4 つのことがすぐに連続して実行されます。

  1. メイン ウィンドウに添付されたシートの表示を開始するようにアプリケーションに指示しています。これで問題ありません。実際にそのaccountButtonPressed:メソッドで必要なコードはこれだけです。

  2. そのシートを開始した直後に、アプリケーション モーダルな方法で、そのシートを単独で (どのウィンドウにも接続せずに画面の真ん中に) 表示したいことをアプリケーションに伝えます。これにより、他のすべてのイベントがブロックされます。アプリケーションで処理されます。つまり、この行はあまり意味がありません。ウィンドウを「ドキュメント モーダル」方式 (シートがアタッチされているウィンドウのみを結合する) または「アプリケーション モーダル」方式でシートとして表示しますが、両方を同時に表示することはできません。;-)

  3. シートを表示した直後に、シートのNSApp表示を停止するように指示します。最終的にはこれを行いたいと思いますが、シートを表示してから 0.0005 秒後にシートを閉じると、ユーザーは少しイライラする可能性があります。

  4. ここで、シート自体を非表示にするように指示します。これはあなたの方法から行う必要がありdidEndSelector:、最初の方法の問題につながります。

-

[NSApp beginSheet:self.accountSheet
   modalForWindow:[mainWindowView window]
    modalDelegate:nil
   didEndSelector:nil
      contextInfo:nil];

これは良いことですが、 ドキュメントとSheet Programming Topics: Using Custom SheetsbeginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:も読んでください。(クラス リファレンス ページの上部にあるコンパニオン ガイドのリンクは、実際に API を使用する方法を学習するのに特に役立ちます。これらは、私が学習していたときに非常に役立ちました)。

を指定nilするとmodalDelegate:、シートが表示されなくなったときに通知されるのを待っているものは何もありません (これは、 を呼び出したときに発生します[NSApp endSheet:sheet])。@selectorまた、シートが終了したときに呼び出す を指定していません。セレクターは関数のようなもので、別名「メソッド」です。

コードは次のようになります。

@implementation MDAppDelegate

- (IBAction)showSheet:(id)sender {
    [NSApp beginSheet:self.sheet
       modalForWindow:self.window
        modalDelegate:self
       didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:)
          contextInfo:NULL];
}

- (IBAction)cancel:(id)sender {
    [NSApp endSheet:self.sheet];
}

- (IBAction)ok:(id)sender {
    [NSApp endSheet:self.sheet];
}

- (void)sheetDidEnd:(NSWindow *)sheet
            returnCode:(NSInteger)returnCode
               contextInfo:(void *)contextInfo {
    [sheet orderOut:nil];
}
@end

この例では、[シートを表示] ボタンをクリックすると、メイン ウィンドウに添付されたシートが表示され始めます。シートには、[キャンセル] ボタンと [OK] ボタンがあり、どちらもそれぞれのメソッドを呼び出します。これらの各メソッドで、 を呼び出します[NSApp endSheet:self.sheet]。これは、モーダル デリゲートとして指定されたオブジェクトNSAppのメソッドを呼び出す必要があることを示しています。次に、シート自体を非表示にするように指示しますsheetDidEnd:returnCode:contextInfo:sheetDidEnd:returnCode:contextInfo:

編集:

すべてNSWindowに、Interface Builder で設定できる「起動時に表示」フラグがあります。このフラグが設定されている場合、nib ファイルがロードされたときにウィンドウが表示されます。設定されていない場合、プログラムで表示するまでウィンドウは非表示になります。次のように nib ファイルのフラグを編集するだけです。

ここに画像の説明を入力

于 2012-10-10T22:40:01.863 に答える