2013-06-07 1 views
2

문서 기반 응용 프로그램이 있습니다. 사용자가 NSTextView에서 선택한 텍스트를 마우스 오른쪽 버튼으로 클릭 할 때 상황에 맞는 정보를 표시하는 컨텍스트 메뉴를 추가하려고합니다.문맥 메뉴에 NSMenuDelegate 메서드가 호출되지 않았습니다.

내 XIB 파일의 루트 객체로 Apple documentation

  • 추가 한 NSMenu의 조언을 따랐다.
  • NSMenu 인스턴스를 NSTextView의 menu 콘센트에 연결했습니다.
  • IBAction을 NSMenu의 NSMenuItem에 연결했습니다.

지금까지 그렇게 좋았습니다. 모든 것은 예상대로 작동합니다 : 메뉴 항목이 나타나고 선택되면 액션이 호출됩니다.

내 메뉴 항목을 적절히 구성 할 수 있도록 메뉴가 나타나기 전에 NSTextView에서 선택한 텍스트를 가져와야합니다. 방금 전에 맞는 볼 메뉴를 사용자 정의하는 방법 : 당신이 컨텍스트 메뉴를 사용자 정의해야하는 경우 문서에 따르면

, 메뉴의 대리인으로 적절한 오브젝트를 설정하고 menuWillOpen를 구현하여 수행 할 수 있습니다 나타납니다.

File 's Owner에 NSMenu의 대리인을 연결합니다. 대리자 메서드가 호출되지 않습니다. (menuWillOpen:이 내가 필요한 유일한 사람이지만 다른 사람도 시도했습니다.)

메뉴 항목을 선택할 때 호출되는 IBAction 내에 중단 점을 설정했습니다. 디버거로 메뉴를 검사하면 델리게이트 메소드를 구현 한 객체로 델리게이트가 올바르게 설정되어있는 것을 볼 수 있습니다.

확인할 다른 항목이 있습니까? 내가 뻔뻔하게 잘못하고있는 건 뭐니?

엑스 코드 v4.6.3
SDK의 v10.8
배포 대상 10.7 뒷조사 후, 이것은 내가 찾은 것입니다

답변

2

: NSTextView 아마 -menuForEvent:를 재정 의하여, 컨텍스트 메뉴로 사용할 다른 NSMenu 인스턴스를 구축 또는 이와 유사한 내부 방법. 이 새로운 메뉴는 Interface Builder에서 생성 한 메뉴의 메뉴 항목을 복사합니다 (실제로 원래 메뉴 항목에서 속성이 복사 된 새 메뉴 항목 인스턴스를 생성하지만 메뉴 위임자를 복사하지는 않습니다) -menuWillOpen:을받지 못합니다. 이것이 의도적인지 여부는 확실하지 않습니다. 그 문서를 읽으면 견적서를 올렸습니다. 그것은 버그 인 것 같습니다.

- (NSMenu *)textView:(NSTextView *)view menu:(NSMenu *)menu forEvent:(NSEvent *)event atIndex:(NSUInteger)charIndex 
{ 
    // if the menu delegate is not self, set another object 
    [menu setDelegate:self]; 

    return menu; 
} 

: 당신이 할 수있는 일

는 그 클래스 NSTextViewDelegate (이미 NSMenuDelegate을 준수 어쩌면 당신의 파일의 소유자,)을 준수 객체에 NSTextView 인스턴스의 대리자를 설정하고 다음과 같은 방법을 구현하는 것입니다 이렇게하면 텍스트보기로 만든 컨텍스트 메뉴에 대리인이 사용됩니다.

NB : NSTextView이 다른 컨텍스트 메뉴를 생성하므로 일 수 있으므로 메뉴 위임자를 자체 나 다른 내부 개체로 설정할 수도 있습니다. 내 테스트에서 대표는 nil이므로 안전한 것처럼 보입니다. 또는 제안 된 인수를 삭제하고 위임자가 올바르게 설정된 NSMenu 인스턴스를 반환 할 수 있습니다.

+0

브라보! 당신이 제안한 것처럼 위임자를 설정하는 것은 효과가있는 것처럼 보이지만, 꼭 할 필요는 없습니다. 귀하가 지적한 NSTextViewDelegate 호출은 텍스트보기와 메뉴에 액세스 할 수있게 해 주며, 이는 필자가 필요로하는 메뉴를 사용자 정의하는 데 필요한 모든 것입니다. 많은 감사합니다. – shebang

0

이 스레드를 찾는 것은 많은 시간을 절약 해주었습니다 ... 감사합니다! Swift의 NSView에서 작동하는 구현은 다음과 같습니다. myNSMenu은 스토리 보드의 출구이며 appDelegate이고 서브 클래스는 NSMenu입니다. 아래 코드에서 대리자를 지정하지 않으면 NSMenuDelegate 함수가 호출되지 않았습니다.

let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate 
    appDelegate.myNSMenu.delegate = appDelegate.myNSMenu 
    NSMenu.popUpContextMenu(appDelegate.myNSMenu, withEvent: theEvent, forView: self)