如何在Objective-C上发送带参数的通知?

时间:2013-04-11 19:53:50

标签: iphone ios notifications

我需要将带有参数@"willAnimateRotationToInterfaceOrientation"toInterfaceOrientation问题#1 )的通知duration发送给应用程序上的所有UIViewController问题#2 )。如何为此编写代码?

[[NSNotificationCenter defaultCenter]
  addObserver:self
     selector:@selector(willAnimateRotationToInterfaceOrientation:toInterfaceOrientation:duration)
         name:@"willAnimateRotationToInterfaceOrientation"
       object:nil];

[[NSNotificationCenter defaultCenter] 
  postNotificationName:@"willAnimateRotationToInterfaceOrientation"
                object:self];

3 个答案:

答案 0 :(得分:19)

使用postNotificationName:object:userInfo:并捆绑您希望在userInfo词典中传递的所有参数。

示例:

您可以发布此类通知

NSDictionary * userInfo = @{ @"toOrientation" : @(toOrientation) };
[[NSNotificationCenter defaultCenter] postNotificationName:@"willAnimateRotationToInterfaceOrientation" object:nil userInfo:userInfo];

然后通过执行以下操作检索您传递的信息:

- (void)willAnimateRotationToInterfaceOrientation:(NSNotification *)n {
    UIInterfaceOrientation toOrientation = (UIInterfaceOrientation)[n.userInfo[@"toOrientation"] intValue];
  //..
}

总结一下上面看到的内容,用于处理通知的选择器采用类型为NSNotification的一个可选参数,您可以存储您想要在userInfo字典中传递的任何信息。 / p>

答案 1 :(得分:1)

这不会像你想象的那样奏效。通知消息调用有一个可选参数,即NSNotification对象:

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

通知对象具有属性userInfo,该属性是可用于传递相关信息的字典。但是您无法注册通知中心要调用的任意选择器。您使用-postNotificationName:object:userInfo:代替-postNotificationName:object:通知该字典; userInfo参数只是您创建的NSDictionary

答案 2 :(得分:0)

你做一个更容易调用的方法,它需要较少的参数,并为你做复杂的调用。

[[NSNotificationCenter defaultCenter]
  addObserver:self
     selector:@selector(doStuff)
         name:@"willAnimateRotationToInterfaceOrientation"
       object:nil];

- (void)doStuff {
  [self willAnimateRotationToInterfaceOrientation:someOrientation
                                    toOrientation:someOtherOrientation
                                         duration:1];
}

你不应该自己打电话给willAnimateRotationToInterfaceOrientation:。而是创建一个名为form的方法,该方法包含要在旋转时激活的代码以及其他时间。