135

アプリ デリゲートから別のクラスの通知レシーバーにオブジェクトを渡そうとしています。

integer を渡したいmessageTotal。今私は持っています:

レシーバーで:

- (void) receiveTestNotification:(NSNotification *) notification
{
    if ([[notification name] isEqualToString:@"TestNotification"])
        NSLog (@"Successfully received the test notification!");
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissSheet) name:UIApplicationWillResignActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveTestNotification:) name:@"eRXReceived" object:nil];

通知を行っているクラスで:

[UIApplication sharedApplication].applicationIconBadgeNumber = messageTotal;
[[NSNotificationCenter defaultCenter] postNotificationName:@"eRXReceived" object:self];

messageTotalしかし、オブジェクトを他のクラスに渡したいです。

4

5 に答える 5

95

提供されたソリューションに基づいて、独自のカスタムデータオブジェクトを渡す例を示すと役立つと思いました(ここでは、質問ごとに「メッセージ」として参照しています)。

クラス A (送信者):

YourDataObject *message = [[YourDataObject alloc] init];
// set your message properties
NSDictionary *dict = [NSDictionary dictionaryWithObject:message forKey:@"message"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationMessageEvent" object:nil userInfo:dict];

クラス B (受信機):

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter]
     addObserver:self selector:@selector(triggerAction:) name:@"NotificationMessageEvent" object:nil];
}

#pragma mark - Notification
-(void) triggerAction:(NSNotification *) notification
{
    NSDictionary *dict = notification.userInfo;
    YourDataObject *message = [dict valueForKey:@"message"];
    if (message != nil) {
        // do stuff here with your message data
    }
}
于 2014-06-21T09:43:18.230 に答える
33

スイフト5

func post() {
    NotificationCenter.default.post(name: Notification.Name("SomeNotificationName"), 
        object: nil, 
        userInfo:["key0": "value", "key1": 1234])
}

func addObservers() {
    NotificationCenter.default.addObserver(self, 
        selector: #selector(someMethod), 
        name: Notification.Name("SomeNotificationName"), 
        object: nil)
}

@objc func someMethod(_ notification: Notification) {
    let info0 = notification.userInfo?["key0"]
    let info1 = notification.userInfo?["key1"]
}

おまけ(絶対にやるべき!):

に置き換えNotification.Name("SomeNotificationName")ます.someNotificationName:

extension Notification.Name {
    static let someNotificationName = Notification.Name("SomeNotificationName")
}

"key0""key1"Notification.Key.key0とに置き換えますNotification.Key.key1

extension Notification {
  enum Key: String {
    case key0
    case key1
  }
}

なぜ私は間違いなくこれをしなければならないのですか?コストのかかるタイプミスを避けるために、名前の変更を楽しんだり、使用法の検索を楽しんだり...

于 2016-12-28T16:31:14.577 に答える