Есть ли способ, чтобы метод executeClose: работал, когда я использую NSBorderlessWindowMask? Какой метод мне нужно переопределить? (если это возможно)
Я переопределил некоторые методы, и это работает.Все, что я хочу знать сейчас, это если я не воспринял это из-за плохого подхода:)
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { return ([menuItem action] == @selector(performClose:) || [menuItem action] == @selector(performZoom:) || [menuItem action] == @selector(performMiniaturize:)) ? YES : [super validateMenuItem:menuItem]; } - (BOOL)windowShouldClose:(id)sender { return YES; } - (void)performClose:(id)sender { if([[self delegate] respondsToSelector:@selector(windowShouldClose:)]) { if(![[self delegate] windowShouldClose:self]) return; } else if([self respondsToSelector:@selector(windowShouldClose:)]) { if(![self windowShouldClose:self]) return; } [self close]; } - (void)performMiniaturize:(id)sender { [self miniaturize:self]; } - (void)performZoom:(id)sender { [self zoom:self]; }
Как сказал Кайл, переопределите ваше окно и добавьте
-(BOOL)canBecomeKeyWindow { return YES; }
И в вашем WindowController должен вызываться
- (IBAction)performClose:(id)sender
при использовании Close MenuItem.
Поскольку в окне без полей нет кнопки закрытия, performClose: не будет работать.Вместо этого вы должны использовать метод close.Однако этот метод также не вызывает windowShouldClose: для делегата окна и не может быть подключен к IBAction.Если вам нужны эти функции, вы можете создать метод-оболочку для обработки закрытия.
performClose:
close
windowShouldClose:
@interface NSWindow (BorderlessClosing) - (IBAction)performBorderlessClose:(id)sender; @end @implementation NSWindow (BorderlessClosing) - (IBAction)performBorderlessClose:(id)sender { if([[self delegate] respondsToSelector:@selector(windowShouldClose:)]) { if(![[self delegate] windowShouldClose:self]) return; } else if([self respondsToSelector:@selector(windowShouldClose:)]) { if(![self windowShouldClose:self]) return; } [self close]; } @end