executeClose: в окне без полей? - PullRequest
       6

executeClose: в окне без полей?

5 голосов
/ 19 февраля 2011

Есть ли способ, чтобы метод executeClose: работал, когда я использую NSBorderlessWindowMask? Какой метод мне нужно переопределить? (если это возможно)

Ответы [ 3 ]

10 голосов
/ 22 февраля 2011

Я переопределил некоторые методы, и это работает.Все, что я хочу знать сейчас, это если я не воспринял это из-за плохого подхода:)

- (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];
}
1 голос
/ 09 марта 2016

Как сказал Кайл, переопределите ваше окно и добавьте

-(BOOL)canBecomeKeyWindow
{
    return YES;
}

И в вашем WindowController должен вызываться

 - (IBAction)performClose:(id)sender

при использовании Close MenuItem.

1 голос
/ 19 февраля 2011

Поскольку в окне без полей нет кнопки закрытия, performClose: не будет работать.Вместо этого вы должны использовать метод close.Однако этот метод также не вызывает windowShouldClose: для делегата окна и не может быть подключен к IBAction.Если вам нужны эти функции, вы можете создать метод-оболочку для обработки закрытия.

@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
...