为什么使用NSNotification参数

时间:2014-02-16 07:18:15

标签: objective-c nsnotification

以下是main.m

中的代码
[[NSNotificationCenter defaultCenter]addObserver:logger selector:@selector(zoneChange:) name:NSSystemTimeZoneDidChangeNotification object:nil];

这是.h文件中的代码

-(void)zoneChange:(NSNotification *)note;

有人能告诉我为什么zoneChange方法将NSNotification作为参数吗? 我们怎么知道这个方法在尝试声明上面的main.m文件中提到的方法使用它时会采用什么参数?

我还对类引用做了一些研究,并为选择器参数

找到了这个
  

选择器,指定接收方发送notificationObserver以通知其通知发布的消息。 notificationSelector指定的方法必须只有一个参数(NSNotification的一个实例)。

请解释一下。感谢

2 个答案:

答案 0 :(得分:3)

想象一下,你有一个有两个表视图的控制器:

@interface MyController : NSViewController <NSTableViewDelegate>

@property(nonatomic,weak) IBOutlet NSTableView *tableView1;
@property(nonatomic,weak) IBOutlet NSTableView *tableView2;

@end

并且控制器被设置为两个表视图的委托。现在,您要跟踪两个表的选择中的更改。您实现了tableViewSelectionDidChange:委托方法,但是当它被调用时,您如何知道哪个表视图确实改变了它的选择?这是notification参数。它的object属性指向发送此通知的表视图,您可以轻松区分两者。它也可能包含userInfo字典,例如NSTableViewColumnDidResizeNotification包含NSTableColumnNSOldWidth个字词。

在描述的情况下,响应通知方法在委托习语下被调用,但在其他情况下(观察通知,目标操作等),您有时也必须区分导致方法的对象调用

@implementation MyController

...

- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
    if ([notification object] == self.tableView1)
        NSLog(@"selection changed in table 1");

    else if ([notification object] == self.tableView2)
        NSLog(@"selection changed in table 2");

    else
        NSLog(@"selection changed in unknown table (???)");
}

- (void)buttonDidClick:(id)sender
{
    NSLog(@"some button did click. which? %@", sender);
}

@end

答案 1 :(得分:2)

嗯,这就是api所说的

- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender

其中notificationSelector是

  

选择器,指定接收者的消息   发送notificationObserver以通知其通知发布。   notificationSelector指定的方法必须具有 one且only   一个参数 NSNotification 的一个实例)。

因此,大多数情况下,您会去阅读Apple提供的文档,以查看您的选择器可以使用哪种参数。

来源:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html