2009-08-26 12 views
0

私のプログラムは、nswindow(NSWindowControllerオブジェクトによって制御される)を使用して定期的にユーザー入力を実行し、実行を継続します。ここココア:私はユーザーの意見を持っています - 今何ですか?

は、ユーザーの入力を取るために、ウィンドウを呼び出し、表示された私のmyController.mmです:私は、[OK]をクリックするか、キャンセルした後

#import "EncryptPasswordDlgController.h" 

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

- (IBAction)showWindow:(id)sender 
{ 
    [super showWindow:sender]; 
    encryptPasswordDlgWindowController = [[NSWindowController alloc] initWithWindowNibName:@"EncryptionPasswordDlg"]; 
    [encryptPasswordDlgWindowController loadWindow]; 
    [[self window] makeKeyAndOrderFront:[self window]]; 

    return; 
} 

-(IBAction)clickOK:(id) sender 
{ 
    password = [passwordField stringValue]; 

    NSLog(@"password is %@", password); 


    [[self window] close]; 
    return; 
} 

-(NSString *)password 
{ 
    return password; 
} 

-(IBAction)clickCancel:(id) sender 
{ 
// close the window 
    password = nil; 
    [[self window] close]; 
    //return; 
} 
@end 

:ここ

EncryptPasswordDlgController encPassController = [[EncryptPasswordDlgController alloc] init]; 

[encPassController showWindow:self]; 
NSString *inputPassword = [encPassController password]; 

は私のNSWindowControllerオブジェクトコードでありますボタンを押すと、それぞれのIBActionメソッドが呼び出され、必要に応じて実行されます。つまり、テキストフィールドからユーザー入力を受け取り、OKをクリックするとパスワードも更新されます。しかし、IBActionのclickOKメソッドの実行が終了すると、myController.mmに戻り、次のステートメント "NSString * inputPassword = [encPassController password];を実行してパスワードを取得する必要があります。それは起こっていない。誰かがこのような状況に取り組む方法を提案することができます。

EDIT:返信用

おかげでボブ。 私は自分の間違いが何であるか理解しました。示すように だから私は、whileループを使用して通知方法を試してみました:

while(isPasswordReceivedForEncryption == NO) 
{ 
      sleep(10000); 
      //continue; 
} 

を私のプログラムの途中で通知が来て、trueにブール変数を設定まで待つように。 しかし、今問題は、それが無限ループに入り、アプリケーションが停止しているということです。

は、ユーザー入力を直接待つMFCのようなものはありません。 本当に、ウィンドウを作成してユーザーの入力を得るのは難しいですか?

+0

あなたは既にこの質問をhttp://stackoverflow.com/questions/1337591/nswindowcontroller-program-executionで尋ねました。毎回新しい質問を投稿しないようにしてください。可能であれば、既存のスレッドを使用してください。 –

答えて

1

あなたの問題は、 - [NSWindowController showWindow:] 'はウィンドウ入力の待機をブロックしないということです。これを呼び出すと、アプリにウィンドウが表示されますが、まだ設定されていないため、パスワードをnilに設定するとすぐに次の行が実行されます。

IBActionは、Run Loopの間に発生します。基本的に、あなたのアプリの流れは次の通りです:

AppControllerを初期化する - >ウィンドウを表示 - >パスワードをnilに設定 - >実行ループを実行して入力を待つ - > OKボタンが押された - >コントローラパスワードフィールド - >実行ループに戻ります。

ここで正確に何が起こっているのかを理解するために、実行ループを読む必要があります。上記のリンクは、あなたが学ぶ必要があるものなどを教えてくれます。マルチスレッドではありませんが、期待通りの動作をしていません。基本的には、myController.mmでは入力を待つように並べ替える必要があります。これはNotificationsで行うことができます。または、IBActionのメソッドを呼び出すだけで、コントローラにパスワードが変更されたことを通知することができます(本質的に通知の機能です)。

編集:実際には、これを修正すると、IBActionで取得したパスワードに「保持」する必要があります。そうしないと、文字列がオートレリースされ、アクセスしようとするとクラッシュします。 Memory Management Guide

関連する問題