2009-08-26 2 views
0

간단히 말해서 내 프로그램의 기능은 다음과 같습니다. NSWindowController 객체가 제어하는 ​​nswindow를 사용하여 주기적으로 사용자 입력을 실행하고 실행을 계속합니다. 여기 코코아 : 내 사용자의 의견이 있습니다 - 지금 무엇입니까?

는 호출하고 사용자 입력을 위해 창을 보여주는 내 myController.mm입니다 : 여기
EncryptPasswordDlgController encPassController = [[EncryptPasswordDlgController alloc] init]; 

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

내 nswindowcontroller 오브젝트 코드 :

#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 

나는 확인을 클릭하거나 취소 한 후 버튼을 클릭하면 각 IBAction 메소드가 호출되고 필요에 따라 실행됩니다. 즉, 텍스트 필드에서 사용자 입력을받는 창이 표시되고 확인을 클릭하면 암호도 업데이트됩니다. 하지만 IBAction clickOK 메소드 실행이 끝나면 myController.mm으로 돌아가서 다음 문장 "NSString * inputPassword = [encPassController password];"를 실행하여 비밀번호를 검색해야합니다. 그것은 일어나지 않습니다. 누구든 개는이 상황을 해결할 방법을 제안 할 수 있습니다.

편집 : 답장을

감사합니다 밥. 이제 내 실수가 무엇인지 알았습니다. 같이 그래서 내가 while 루프를 사용하여 알림 방법을 시도 :

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

을 내 프로그램의 중간에 알림이 오면 true로 부울 변수를 설정까지 기다릴 수 있도록. 하지만 문제는 무한 루프가되어 응용 프로그램이 멈추는 것입니다.

사용자 입력을 직접 기다리는 MFC와 비슷한 것은 없습니다. 정말 창을 만들고 사용자 입력을 얻는 것이 어렵거나 여기에 뭔가가 빠져 있습니다.

+0

이미이 질문을 http://stackoverflow.com/questions/1337591/nswindowcontroller-program-execution에서 요청했습니다.매번 새로운 질문을 게시하지 마십시오. 가능할 때마다 기존 스레드를 사용하십시오. –

답변

1

문제는 '- [NSWindowController showWindow :]'가 창 입력 대기를 차단하지 않는다는 것입니다. 이 함수를 호출하면 앱에 창을 표시하도록 지시하지만 암호가 아직 설정되지 않았으므로 비밀번호를 nil로 설정하면 즉시 다음 행을 실행합니다.

Run Loop 동안 IBAction이 발생합니다. 기본적으로 앱의 흐름은 다음과 같습니다.

앱 컨트롤러 초기화 -> 창 표시 -> 비밀번호 설정 -> 실행 루프를 실행하여 입력 대기 -> 확인 버튼 누름 -> 설정 컨트롤러 암호 필드 -> 실행 루프로 돌아갑니다.

여기 정확히 무엇이 일어나는지 이해하려고 시도하려면 실행 루프를 읽어야합니다. 위의 링크를 통해 배워야 할 것을 가르쳐 줄 것입니다. 다중 스레드가 아니지만 예상대로 실행되지 않습니다. 기본적으로 myController.mm에서 입력을 기다리는 것과 같이 다시 정렬해야합니다. 이 작업은 Notifications을 통해 수행하거나 IBAction에서 컨트롤러에 비밀번호가 변경되었음을 알리는 메소드 (본질적으로 알림의 의미)를 호출하여 수행 할 수 있습니다.

편집 : 실제로이 문제를 해결하면 IBAction 중에 얻은 암호에 '보유'를해야합니다. 그렇지 않으면 문자열이 자동 반복 실행되고 액세스하려고하면 충돌이 발생합니다. Memory Management Guide

관련 문제