【问题标题】:performClose: on a borderless window?performClose:在无边框窗口上?
【发布时间】:2011-06-30 09:44:59
【问题描述】:

有没有办法让方法 performClose: 在我使用 NSBorderlessWindowMask 时工作?我必须重写什么方法? (如果可能的话)

【问题讨论】:

    标签: objective-c cocoa xcode nswindow


    【解决方案1】:

    我已经覆盖了一些方法,并且它有效。我现在只想知道我是否没有从错误的方法中接受它:)

    - (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];
    }
    

    【讨论】:

    • 我无法用语言表达我对这篇文章的感谢,非常感谢。一直在寻找一个小时来解决这个问题。
    • 请注意,在这种情况下,无边框窗口也应该为 canBecomeKeyWindow 返回 YES。
    • 告诉我你什么时候来德国,这样我就可以付钱给你喝啤酒了! ?
    【解决方案2】:

    由于无边框窗口没有关闭按钮,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
    

    【讨论】:

    • 感谢您的回复,但我想使用 performClose: 因为我希望菜单栏中的按钮与我的第一响应者的方法(performClose:、performZoom:、performMiniaturize: )。我希望我的菜单中的按钮以及键盘快捷键(cmd+w ...)适用于我的应用程序中的每个窗口......主窗口(无边框),还有设置窗口,这是一个经典的 NSWindow。 ..
    【解决方案3】:

    正如凯尔所说,覆盖你的窗口并添加

    -(BOOL)canBecomeKeyWindow
    {
        return YES;
    }
    

    在你的 WindowController 中,

     - (IBAction)performClose:(id)sender
    

    应该在使用 Close MenuItem 时调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多