8

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

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

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

3 回答 3

20

使用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

于 2013-04-11T20:00:21.043 回答
1

这不像你想象的那样工作。通知消息调用有一个可选参数,它是一个NSNotification对象:

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

通知对象有一个属性 ,userInfo它是一个字典,可以用来传递相关信息。但是您不能注册任意选择器以供通知中心调用。您通过使用-postNotificationName:object:userInfo:而不是通知传递该字典-postNotificationName:object:;该userInfo参数只是NSDictionary您创建的。

于 2013-04-11T20:01:30.690 回答
0

您使调用方法更容易,它需要更少的参数并为您执行复杂的调用。

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

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

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

于 2013-04-11T20:01:29.830 回答