【发布时间】:2011-06-30 09:44:59
【问题描述】:
有没有办法让方法 performClose: 在我使用 NSBorderlessWindowMask 时工作?我必须重写什么方法? (如果可能的话)
【问题讨论】:
标签: objective-c cocoa xcode nswindow
有没有办法让方法 performClose: 在我使用 NSBorderlessWindowMask 时工作?我必须重写什么方法? (如果可能的话)
【问题讨论】:
标签: objective-c cocoa xcode nswindow
我已经覆盖了一些方法,并且它有效。我现在只想知道我是否没有从错误的方法中接受它:)
- (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];
}
【讨论】:
由于无边框窗口没有关闭按钮,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
【讨论】:
正如凯尔所说,覆盖你的窗口并添加
-(BOOL)canBecomeKeyWindow
{
return YES;
}
在你的 WindowController 中,
- (IBAction)performClose:(id)sender
应该在使用 Close MenuItem 时调用。
【讨论】: