【问题标题】:Open and close NSWindow with NSButton through NSWindowController?通过NSWindowController用NSButton打开和关闭NSWindow?
【发布时间】:2011-10-05 01:39:21
【问题描述】:

我有一个自定义的 NSButton,我实际上是在一个 NSStatusItem 中。单击 NSButton 时,它会启动我的窗口。再次单击 NSButton 时,窗口应关闭。

如果窗口是打开的,它看起来好像 NSButton 停止响应(或不接收)点击事件!以下是相关代码:

[statusItem setView:myCustomButton];
[myCustomButton setAction:@selector(showWindow:)];

- (void)showWindow:(id)sender {
    if(!myWindowController) {
        myWindowController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindow"];
    }

    [myWindowController showWindow:statusItem];
    [myWindowController.window orderFront:nil];
}

我在做一些疯狂的事情吗?如果我在上面设置了断点,第一次单击按钮时会命中,但再次单击按钮时不会命中。

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    我猜你没有在按钮上设置目标。如果一个按钮有一个动作但没有目标,它会被发送到响应者链上。当显示新窗口时,响应者链可能正在更改,这意味着您的操作正在被发送到不同的地方。

    tl;dr:尝试在按钮上设置目标。

    【讨论】:

    • 这听起来很合理。 -showWindow: 在 NSWindowController 上实现,因此每个带有窗口控制器的窗口都可以拦截该消息。但是由于当您单击该按钮时,包含该按钮的窗口始终是最前面的窗口,因此它的窗口控制器应该始终拦截该消息。实际上,由于在该方法中分配了一个窗口控制器,该窗口控制器结束了对消息的拦截,所以它总是显示窗口。将方法签名更改为“toggleWindow:”之类的内容,看看会发生什么。
    • 对于未来的谷歌用户,我想补充一点,我的 IBActions 没有被调用。这是由于我的整个视图控制器为 nil 引起的,因为在将它传递给 window.beginSheet 之后我没有将它存储在属性中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多