2010-02-04 1 views
3

NSOpenPanel 중에 사용자로부터 추가 정보를 얻으려고하지만 열린 패널이 완료되기 전에 해당 정보의 유효성을 검사해야합니다. 예를 들어 사용자가 열린 패널 선택 항목에서 파일에 대한 메모를 추가 할 수 있지만 해당 메모가 비어 있지 않은지 확인해야 할 수 있습니다.NSOpenPanel 액세서리보기의 입력 유효성 확인

컨트롤이 NSObjectController에 바인딩되어있는 액세서리보기가 있는데,이 액세서리의 콘텐트 개체는 부속보기의 펜촉을로드하는 데 사용하는 NSViewController의 표시된 개체에 바인딩됩니다. 표시된 개체의 유효 확인 방법은 NSKeyValueCoding (예 : -(BOOL)validateKey:error:)입니다. 사용자가 컨트롤의 값을 수정할 때 유효성 검사가 올바르게 처리됩니다 (모달 대화 상자를 통해 위반이보고됩니다).

내 문제는 사용자가 액세서리보기에서을 입력하지 않으면 유효성을 확인하는 방법을 알 수 없다는 것입니다. 예를 들어, 액세서리보기에서 텍스트가 길이가 0이 아닌 것으로 확인 된 바운드 개체가있는 단일 텍스트 필드가 있다고 가정합니다. 사용자가 텍스트를 입력하면 (유효성 검사가 성공한 경우) 텍스트가 삭제되고 유효성 검사가 실패하고 사용자에게 오류가 표시됩니다. 그러나 사용자가 텍스트를 입력하지 않으면 열려있는 패널이 오류없이 닫힙니다. 열린 패널이 닫히기 전에 이 아닌 텍스트가이 아닌지 확인하려면 어떻게해야합니까?

답변

3

컨트롤러를 공개 패널의 대리인으로 등록한 다음 -panel:isValidFilename: 대리자 메서드를 구현해야합니다. 해당 방법에서 NO을 반환하면 열려있는 대화 상자가 닫히지 않도록 할 수 있습니다.

- (BOOL)panel:(id)sender isValidFilename:(NSString *)filename 
{ 
    //validate the field in some way, in this case by making sure it's not empty 
    if([[textField stringValue] length] == 0) 
    { 
     //let the user know they need to do something 
     NSAlert *alert = [[NSAlert alloc] init]; 
     [alert setMessageText:@"Please enter some text."]; 
     [alert addButtonWithTitle:@"OK"]; 
     [alert beginSheetModalForWindow:sender modalDelegate:nil didEndSelector:NULL contextInfo:NULL]; 
     //return NO to prevent the open panel from completing 
     return NO; 
    } 
    //otherwise, allow the open panel to close 
    return YES; 
}