【问题标题】:Window close button hijacking on Snow Leopard雪豹上的窗口关闭按钮劫持
【发布时间】:2011-12-20 17:46:51
【问题描述】:

我正在开发一个基于 NSDocument 的应用程序,每个窗口(选项卡)有多个文档。这意味着我需要自己处理窗口的关闭,以便在窗口关闭之前查看属于该窗口的文档。为此,我使用 standardWindowButton:NSWindowCloseButton 访问了 NSWindow 的关闭按钮,并将此按钮的目标/操作设置为我的方法,而不是标准(和私有)_close: 方法。

这在 Lion 上效果很好,但在 Snow Leopard 上会导致问题。每当显示模式对话框时,关闭按钮都会按预期禁用。但是当模式对话框被关闭时,在 Snow Leopard 上,关闭按钮永远不会重新启用。之后我尝试使用[closeButton setEnabled:YES] 等以编程方式重新启用它,但它似乎没有任何效果。我已经确认只有在我更改了关闭按钮的目标/操作时才会发生这种情况。

关于如何在 Snow Leopard 上避免这种行为的任何想法,或者可能是劫持关闭按钮的另一种方法?是什么控制工具栏按钮的启用状态?也许我可以在那里覆盖一些东西?

【问题讨论】:

  • 如果在显示对话框之前删除目标和操作并在对话框关闭时添加它会发生什么?
  • 我以为我已经尝试过了,但现在我做到了,它看起来很有效!尽管要确切地找出何时为我所有不同的模态对话框添加和删除目标/动作有点棘手。谢谢。

标签: objective-c macos cocoa nswindow


【解决方案1】:

我原以为你可以使用 windowShouldClose: 委托方法

将 Windows 委托设置为 AppDelegate。在 AppDelegate 中使用 windowShouldClose: 委托方法来调用您的关闭方法并通过返回 NO 来停止窗口关闭。 在您的方法中进行所有检查,然后执行关闭:窗口。看我的例子

 NSWindow * thisWindow; //--pointer to window that will be closed
BOOL windowClose;//-- bool for confirming close of window.

- (BOOL)windowShouldClose:(id)sender{
    thisWindow =sender;//-- set thisWindow to the sender window,the one that is to be closed )
    //if (sender ==theWindow) {//--you can use this to do further checking

        if (windowClose) {//-- Close window if YES
            return YES;  
        } 
    //}


    [self performSelector:@selector(myCloseWindow) ];//go to your method
    windowClose =FALSE;//-- reset
    return NO;//do not close window here
}

- (void) myCloseWindow {
    NSLog(@"closing window");//-- do your stuff
    windowClose =TRUE;//--give the ok to close the window
    [thisWindow performClose:thisWindow];//-- perform the close, which will be redirected back to the delegate, which will now allow the window to close
}

【讨论】:

  • 您可能希望这可以工作,但事实并非如此,因为此委托方法是在窗口实际关闭之前调用的,这与基于文档的应用程序中的窗口关闭按钮不同。例如,如果文档未保存,则文档架构会在尝试关闭窗口之前尝试要求用户保存文档,因此只有在唠叨用户之后才会调用此委托方法,这为时已晚。
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
相关资源
最近更新 更多