2014-01-27 3 views
0

문서 기반 응용 프로그램을 사용하고 문서보기에서 NSSearchField가 있습니다. 검색 필드에 표시 할 메뉴를 활성화했으며 메뉴 항목에 작업을 연결했습니다. 메뉴 항목 중 하나를 "대소 문자 일치"라고합니다. 이 메뉴 항목 옆에 수표를 넣고 빼낼 수 있기를 원합니다. 그렇게하려고하면 메뉴에 검사가 표시되지 않습니다.메뉴가 업데이트되지 않는 NSSearchField

-(IBAction)searchMenuMatchCase:(id)sender { 
    NSMenuItem *smi = [searchMenu itemWithTitle:@"Match Case"]; 
    if (searchCaseSensitive) { 
     searchCaseSensitive = false; 
     [[searchMenu itemWithTitle:@"Match Case"] setState:NSOffState]; 
    } else { 
     searchCaseSensitive = true; 
     [[searchMenu itemWithTitle:@"Match Case"] setState:NSOnState]; 
    } 
    [searchMenu update]; 
    NSLog(@"SM State %ld",[smi state]); 
} 

이 코드는 실행, 나는 1로 0 0에서 1로가는 상태를 나타내는 로그 메시지가 그러나 메뉴 항목 옆에 체크가 결코됩니다. 디버깅하는 동안 메뉴 항목 객체를 볼 때 토글하기 전에 "상태"값이 0과 1로 설정되어 있습니다.

제가 누락 된 부분에 대한 제안 사항이 있습니까?

+0

예, 'validateMenuItem' 메소드를 사용해야합니다. 이는 메뉴가 팝업 될 때 사용되는 실제 메뉴가 IBOutlet이 직접 제어하는 ​​메뉴가 아니라 해당 메뉴의 사본이기 때문입니다. –

답변

0

이 문제를 해결하려면 NSMenuDelegate를 사용하고 validateMenuItem 메서드를 사용해야했습니다. 이 방법은 메뉴를 그리기 전에 validateMenuItem 메서드가 호출되어 메뉴를 그리기 전에 상태가 올바르게 설정되었는지 확인할 수 있습니다. 무슨 일이 일어 났는지는 원본 코드에서 가져온 메뉴 항목이 그려지는 실제 메뉴가 아니라 단지 템플릿이라는 것입니다.

/** 
This is called when the user selectes the "Match Case" menu item found in the Search field 
*/ 
-(IBAction)searchMenuMatchCase:(id)sender { 
    if (searchCaseSensitive) { 
     searchCaseSensitive = false; 
    } else { 
     searchCaseSensitive = true; 
    } 
} 

/** 
This is called Each time a menu is shown. 
*/ 
-(BOOL) validateMenuItem:(NSMenuItem *)menuItem { 

    if ([[menuItem title] compare:@"Match Case"] == 0) { 
     if (searchCaseSensitive) { 
      [menuItem setState:NSOnState]; 
     } else { 
      [menuItem setState:NSOffState]; 
     } 
    } 
    return YES; 
} 
관련 문제