2009-08-27 4 views
1

を閉じていない私は、カスタムのモーダルダイアログボックスを表示しようとし、それを次のようにやっている:モーダルカスタムシート

EncPasswordSheetはIBOutlet NSWindowの*型です。

@implementation EncryptionPasswordSheet 
-(id)init  
{  
    return self;  
} 

- (void)showCustomDlg:(NSWindow *)window 
{  
    if (!EncPasswordSheet)  
    {   
     [NSBundle loadNibNamed: @"EncryptionPasswordDlg" owner: self]; 
    }   
    [NSApp beginSheet:EncPasswordSheet modalForWindow:window modalDelegate:nil didEndSelector:nil contextInfo:nil];  
    [NSApp runModalForWindow: EncPasswordSheet];   
    [NSApp endSheet: EncPasswordSheet];  
    [EncPasswordSheet orderOut: self];  
} 

- (IBAction)getPasswordFromSheet:(id)sender 
{ 
    password = [passwordField stringValue]; 
    [NSApp stopModal];  
} 

- (IBAction)cancelEncPasswordSheet:(id)sender  
{  
    password = nil;  
    [NSApp stopModal];   
} 

@end 

ダイアログボックスが表示され、入力されます。 「OK」または「キャンセル」を押すと、それぞれのIBActionメソッドが実行され、プログラムが続行されます。問題は、ダイアログボックスが途切れていないことです。つまり、閉じていないか消えているということです。

- (void)showCustomDlg:(NSWindow *)window { 
    if (!EncPasswordSheet) { 
     [NSBundle loadNibNamed: @"EncryptionPasswordDlg" owner: self]; 
    } 

    [NSApp beginSheet:EncPasswordSheet 
     modalForWindow:window modalDelegate:nil 
     didEndSelector:nil contextInfo:nil]; 
} 

- (IBAction)getPasswordFromSheet:(id)sender { 
    password = [passwordField stringValue]; 
    [EncPasswordSheet orderOut: self]; 
    [NSApp endSheet: EncPasswordSheet]; 
} 

- (IBAction)cancelEncPasswordSheet:(id)sender { 
    password = nil; 
    [EncPasswordSheet orderOut: self]; 
    [NSApp endSheet: EncPasswordSheet]; 
} 
+0

コードを少し分かりやすくするために、コードを再フォーマットすることをお勧めします。 4つのスペースでインデントして、テキストとしてコードを書式設定します。 – jergason

答えて

0

私はあなたがOKで呼ばIBActionsからendSheetを呼び出すと、私はgetPasswordFromSheetcancelEncPasswordSheetあると仮定し、ボタンを、キャンセルすべきだと思います窓?私がしなければ、ダイアログはシートとして表示されず、完了しても閉じないので。元のコードでそれを試してください。

+0

返信のためにOlbaumに感謝します。私はあなたの方法を試みたが、うまくいかなかった。問題は私が "runModelForWindow"を使用して、ユーザーが入力してokを押すかキャンセルするまでプログラムの実行を止めさせることです。 – King

+0

あなたは正しいです、申し訳ありません。この回答を無視して、私の新しい回答を見てください。 –

4

は、ダイアログのInterface Builderであなた未確認の「起動時に目に見える」を持っている:

+0

yehはそのトリックを試みましたが、どちらも失敗しました。とにかく返信いただきありがとうございます。 – King

+0

テストプロジェクトを作って動作させたので、それは奇妙です。あなたのダイアログは実際にメインウィンドウから滑っていくシートとして現れますか?あなたはどのようにshowCustomDlgを呼び出しますか?どの窓を渡しますか? –

+0

私はちょうどこの答えを見つけたと私の人生を救った。私は2日間、私のモーダルダイアログシートがシートのように開くのではなくウィンドウであることを理解しようとしました...愚かな "打ち上げ時に見える" +1あなたのために良い! – Bot