我想跟踪OS应用程序中每次出现(对用户可见)某个窗口的时间。哪里是呼叫追踪器最合适的地方?
也许是windowWillLoad?
我希望找到像windowWillAppear这样的东西,但似乎我想的太多了iOS。
发布于 2012-08-20 18:34:21
如何获得通知,如NSWindowDidBecomeMainNotification,由main我猜是最顶部的一个屏幕上直接可见的用户。
发布于 2017-07-31 15:05:41
是的,人们期望窗口会用windowWillAppear或windowDidAppear消息通知它的代理或控制器,或者发布像NSWindowDidAppearNotification这样的文档化通知。但遗憾的是,这些都不存在。我向苹果提交了一份bug报告,得到的建议是使用故事板和视图控制器。这在已经使用了大量窗口控制器和xibs的遗留应用程序中是没有帮助的。
您可以子类化NSWindow并重写orderWindow:relativeTo:来发送通知。大多数(但不是全部)使窗口显示自身的消息最终都要经过这种方法,包括orderBack:、orderFront:、makeKeyAndOrderFront:和-[NSWindowController showWindow:]。但是orderFrontRegardless不通过orderWindow:relativeTo:,所以为了完整性,您可能还想覆盖它。
另一种通知方式是创建NSViewController的子类,它控制窗口中始终可见的一些视图。视图控制器将接收viewWillAppear和viewDidAppear。
如果您出于其他原因已经将NSWindow或NSViewController子类化,那么这两种方法都是一个合理的解决方案。
如果您还没有派生NSWindow的子类,并且没有Cocoa子类用于在窗口中始终可见的视图,那么另一种方法是使用NSViewController绑定将窗口的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];
}当窗口变为可见时,将使用YES参数调用setWindowIsVisible:设置器。请注意,如果整个应用程序被隐藏并重新出现,则会再次调用设置器,即使在应用程序被隐藏时没有使用参数NO调用它。因此,请注意,不要认为该窗口以前是隐藏的。
此外,绑定可能会创建一个保留周期,因此您可能应该在窗口关闭时取消绑定它,除非您希望保留窗口和控制器。请注意,当窗口关闭时,它会开机自检NSWindowWillCloseNotification,所以您不需要任何特殊的魔法来检测它。
https://stackoverflow.com/questions/12036018
复制相似问题