我想在 OS X 应用程序中每次出现某个窗口(对用户可见)时进行跟踪。哪里是最适合调用跟踪器的地方?
windowWillLoad,也许?
我希望能找到类似的东西,windowWillAppear
但似乎我想太多 iOS 了。
我想在 OS X 应用程序中每次出现某个窗口(对用户可见)时进行跟踪。哪里是最适合调用跟踪器的地方?
windowWillLoad,也许?
我希望能找到类似的东西,windowWillAppear
但似乎我想太多 iOS 了。
如何获得通知,例如NSWindowDidBecomeMainNotification
,主要我猜是用户直接可见的屏幕上最顶部的通知。
请参阅:Apple 文档
是的,人们会期望一个窗口会用一个windowWillAppear
orwindowDidAppear
消息通知它的委托或它的控制器,或者发布一个记录在案的通知,如NSWindowDidAppearNotification
. 但很可惜,这些都不存在。我向 Apple 提交了一份错误报告,并得到了使用故事板和视图控制器的建议。这对于已经使用大量窗口控制器和 xib 的旧版应用程序没有帮助。
您可以继承NSWindow
并覆盖orderWindow:relativeTo:
以发送通知。大多数(但不是全部)使窗口显示自身的消息最终都会通过这种方法,包括orderBack:
、orderFront:
、makeKeyAndOrderFront:
和-[NSWindowController showWindow:]
。但orderFrontRegardless
不会通过,因此您还orderWindow:relativeTo:
需要覆盖它以确保完整性。
另一种获得通知的方法是创建一个子类NSViewController
来控制一些在窗口中始终可见的视图。视图控制器将接收viewWillAppear
和viewDidAppear
。
如果您正在子类化NSWindow
或NSViewController
已经出于其他原因,这些都是合理的解决方案。
如果您还没有NSWindow
进行子类化,并且没有NSViewController
在窗口中始终可见的视图的子类,那么另一种方法是使用 Cocoa 绑定将窗口的visible
绑定连接到您的对象的一个属性。例如,我有一个自定义NSWindowController
子类。我给了它一个windowIsVisible
属性:
@interface MyWindowController ()
@property (nonatomic) BOOL windowIsVisible;
@end
我实现了这样的访问器:
- (BOOL)windowIsVisible { return self.window.visible; }
- (void)setWindowIsVisible:(BOOL)windowIsVisible {
NSLog(@"window %@ became %s", self.window, windowIsVisible ? "visible" : "hidden");
}
在中awakeFromNib
,我将窗口的visible
绑定绑定到属性,如下所示:
- (void)awakeFromNib {
[super awakeFromNib];
[self.window bind:NSVisibleBinding toObject:self withKeyPath:NSStringFromSelector(@selector(windowIsVisible)) options:nil];
}
当窗口变得可见时,将setWindowIsVisible:
使用参数调用 setter YES
。请注意,如果整个应用程序被隐藏并重新出现,则将再次调用 setter,即使NO
在隐藏应用程序时未使用参数调用它。因此,请注意不要假设该窗口以前是隐藏的。
此外,绑定可能会创建一个保留周期,因此您可能应该在窗口关闭时取消绑定它,除非您想保留窗口和控制器。请注意,窗口NSWindowWillCloseNotification
在关闭时确实会发布,因此您不需要任何特殊的魔法来检测它。