2

我想在 OS X 应用程序中每次出现某个窗口(对用户可见)时进行跟踪。哪里是最适合调用跟踪器的地方?

windowWillLoad,也许?

我希望能找到类似的东西,windowWillAppear但似乎我想太多 iOS 了。

4

2 回答 2

1

如何获得通知,例如NSWindowDidBecomeMainNotification,主要我猜是用户直接可见的屏幕上最顶部的通知。

请参阅:Apple 文档

于 2012-08-20T10:34:20.887 回答
1

是的,人们会期望一个窗口会用一个windowWillAppearorwindowDidAppear消息通知它的委托或它的控制器,或者发布一个记录在案的通知,如NSWindowDidAppearNotification. 但很可惜,这些都不存在。我向 Apple 提交了一份错误报告,并得到了使用故事板和视图控制器的建议。这对于已经使用大量窗口控制器和 xib 的旧版应用程序没有帮助。

您可以继承NSWindow并覆盖orderWindow:relativeTo:以发送通知。大多数(但不是全部)使窗口显示自身的消息最终都会通过这种方法,包括orderBack:orderFront:makeKeyAndOrderFront:-[NSWindowController showWindow:]。但orderFrontRegardless不会通过,因此您orderWindow:relativeTo:需要覆盖它以确保完整性。

另一种获得通知的方法是创建一个子类NSViewController来控制一些在窗口中始终可见的视图。视图控制器将接收viewWillAppearviewDidAppear

如果您正在子类化NSWindowNSViewController已经出于其他原因,这些都是合理的解决方案。

如果您还没有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在关闭时确实会发布,因此您不需要任何特殊的魔法来检测它。

于 2017-07-31T07:05:40.793 回答