以下是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的一个实例)。
请解释一下。感谢
答案 0 :(得分:3)
想象一下,你有一个有两个表视图的控制器:
@interface MyController : NSViewController <NSTableViewDelegate>
@property(nonatomic,weak) IBOutlet NSTableView *tableView1;
@property(nonatomic,weak) IBOutlet NSTableView *tableView2;
@end
并且控制器被设置为两个表视图的委托。现在,您要跟踪两个表的选择中的更改。您实现了tableViewSelectionDidChange:
委托方法,但是当它被调用时,您如何知道哪个表视图确实改变了它的选择?这是notification
参数。它的object
属性指向发送此通知的表视图,您可以轻松区分两者。它也可能包含userInfo
字典,例如NSTableViewColumnDidResizeNotification
包含NSTableColumn
和NSOldWidth
个字词。
在描述的情况下,响应通知的方法在委托习语下被调用,但在其他情况下(观察通知,目标操作等),您有时也必须区分导致方法的对象调用
@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提供的文档,以查看您的选择器可以使用哪种参数。