불행하게도,이 작업을 수행 할 청소 방법이 없다. 이제
- (BOOL)makeFirstResponder:(NSResponder *)responder;
{
// Prevent popover content view from forcing our current first responder to resign
if (responder != self.firstResponder && [responder isKindOfClass:[NSView class]]) {
NSWindow *const newFirstResponderWindow = ((NSView *)responder).window;
NSWindow *currentFirstResponderWindow;
NSResponder *const currentFirstResponder = self.firstResponder;
if ([currentFirstResponder isKindOfClass:[NSWindow class]])
currentFirstResponderWindow = (id)currentFirstResponder;
else if ([currentFirstResponder isKindOfClass:[NSView class]])
currentFirstResponderWindow = ((NSView *)currentFirstResponder).window;
// Prevent some view in popover from stealing our first responder, but allow the user to explicitly activate it with a click on the popover.
// Note that the current first responder may be in a child window, if it's a control in the "thick titlebar" area and we're currently full-screen.
if (newFirstResponderWindow != self && newFirstResponderWindow != currentFirstResponderWindow && self.currentEvent.window != newFirstResponderWindow)
for (NSView *responderView = (id)responder; responderView; responderView = responderView.superview)
if ([responderView conformsToProtocol:@protocol(LIPopoverFirstResponderStealingSuppression)] &&
((id <LIPopoverFirstResponderStealingSuppression>)responderView).suppressFirstResponderWhenPopoverShows)
return NO;
}
return [super makeFirstResponder:responder];
}
합니다 다행히,하지만 나는 그것을 맛있는 라이브러리의 추악한 방법으로 수행 한 3 - 당신은 NSWindow 표시의 하위 클래스에서이 메서드를 넣어 만들 필요가 있는지 문제가되는 문서 창은 서브 클래스 확인 팝 오버의 내용보기 서브 클래스는이 프로토콜을 구현합니다
// NSPopover doesn't respect -acceptsFirstResponder of its content view (Radar 10666891).
@protocol LIPopoverFirstResponderStealingSuppression <NSObject>
@property (readonly, nonatomic) BOOL suppressFirstResponderWhenPopoverShows;
@end
또한 NSPopover이 컨텐츠보기의 -acceptsFirstResponder을 존중 요청 애플과 버그를 제출하시기 바랍니다; 여러 개발자가 버그를 신고 할 때 100 % 수정됩니다.
아마도 'NSPopover'에로드 된 '보기'는 NIB 파일에서 구성되고보기 컨트롤러를 통해로드됩니까? 해당 NIB 파일에 * 첫 번째 응답자가 올바르게 설정되어 있습니까? AFAIK, Popover는 Windows 및 View의 일반적인 응답 * 동작을 존중해야합니다. – trojanfoe
@tojanfoe 질문이 잘못 이해 될 수있어서 유감입니다. NSTokenField는 popover 안에 없습니다. 질문을 편집하고 명확성을 위해 이미지를 추가했습니다. – Lukas
"NSPopover"이외의 것을 사용해야 할 수도 있습니다. popover의 예상되는 동작은 사용자가 상호 작용할 수있는 몇 가지 컨트롤을 제공하는 것입니다. – trojanfoe