1

当另一个窗口变得可见时,我正在尝试更新另一个窗口。所以我找到了 NSWindowDidExposeNotification 并尝试使用它,所以我在 awakeFromNib 中写道:

// MyClass.m
- (void)awakeFromNib {
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self
           selector:@selector(mentionsWindowDidExpose:)
               name:NSWindowDidExposeNotification
             object:nil];
}

并实现了方法

// MyClass.h
- (void)mentionsWindowDidExpose:(id)sender;

// MyClass.m
- (void)mentionsWindowDidExpose:(id)sender {
    NSLog(@"test");
}

但它永远不会被调用,这很奇怪。我在这里做错了什么?

4

1 回答 1

2

一般来说,您会将您的控制器设置为窗口的委托,以便接收这些通知,如下所示:

// MyClass.m
- (void)awakeFromNib {
    // note: this step can also be done in IB by dragging a connection
    // from the window's "delegate" property to your `MyClass` object
    [window setDelegate:self];
}

- (void)windowDidExpose:(NSNotification *)notification {
    NSLog(@"test");
}

虽然,在这里这里阅读后,windowDidExpose可能不是你最好的选择。我建议改用 windowDidBecomeKey委托方法。每当您的窗口获得“焦点”(开始响应用户输入)时,就会发布该窗口,这可能是显示第二个窗口的正确时间。

更新:(回应评论)

Apple 的文档(引用如下)表明这NSWindowDidExposeNotification仅对非保留窗口有效,根据我上面链接的帖子,这种情况非常罕见。

NSWindowDidExposeNotification

每当非保留的 NSWindow 对象的一部分暴露时发布,无论是通过在其他窗口前面排序还是通过从它前面删除其他窗口。

通知对象是已经暴露的 NSWindow 对象。userInfo 字典包含...已暴露的矩形。

在更高的层次上,NSNotification对象只是在 Cocoa 类和NSNotificationCenter对象之间传递的数据包。NSNotificationCenter对象是管理这些数据包并根据需要将它们发送给观察者的控制器。通常不需要直接捕获通知。您可以在您的类中简单地使用 KVC/KVO 或预定义的委托,而 Cocoa 会在幕后处理所有肮脏的细节。

如果您想了解更多信息,请参阅通知编程主题键值编码编程指南。

于 2010-04-27T21:50:18.957 回答