【发布时间】:2011-12-22 06:33:58
【问题描述】:
我有一个使用垃圾收集和主窗口构建的 Cocoa 应用程序。这个窗口提供了一个按钮,当点击它时会触发窗口控制器上的一个动作,如下所示:
- (IBAction) buttonClick:(id)sender {
utilityWindowController = [[UtilityWindowController alloc] initWithWindowNibName:@"Utility"];
[utilityWindowController showWindow:sender];
}
这很好用,除了每次单击按钮时,都会打开一个新窗口,即使我最后一次单击的窗口仍然显示。好的 - 这就是我要求它做的事情,但我一次只想要这个窗口的一个实例。所以我想要的行为是:
- 如果窗口不显示,新建一个并显示。
- 如果窗口正在显示,要么什么都不做,要么聚焦现有窗口(放在前面等)。
为了尝试获得这种行为,我尝试了这个:
- (IBAction) buttonClick:(id)sender {
if (!utilityWindowController) {
utilityWindowController = [[UtilityWindowController alloc] initWithWindowNibName:@"Utility"];
}
[utilityWindowController showWindow:sender];
}
这样效果更好,因为现在我的主窗口会记住我第一次单击按钮时创建的控制器,并且如果它已经有一个窗口,则只会显示该窗口。但是,它基本上是重复使用同一个窗口,这会导致另一个问题。
实用程序窗口具有图形显示,并在首次创建时启动计时器。实用程序窗口控制器有一个 windowWillClose: 方法,该方法在窗口关闭时禁用计时器,因为当用户看不到显示时继续触发计时器是没有用的。但是,当用户再次点击主窗口中的按钮以显示实用程序窗口时,窗口显示正常,但计时器并没有再次启动。
我似乎找不到可以用来重新启动计时器的 windowWillShow: 方法。
另一种方法是,如果上面的代码能够检测到实用程序窗口已关闭并重新创建一个新窗口,那么将调用 awakeFromNib 方法来启动计时器。但是,我不知道该怎么做。
第三种方法当然是继续上面代码的第二个版本,但调用一个单独的方法,我将在实用程序窗口控制器中提供该方法,如果尚未运行,它将启动计时器。
处理这类事情的最佳方法是什么?这似乎是一个相当标准的窗口管理事情,但我还没有在 Cocoa 中找到正确的方法。
【问题讨论】:
标签: objective-c cocoa