web-dev-qa-db-ja.com

NSNotificationで渡されたアクセスオブジェクト?

NSDictionaryを投稿しているNSNotificationがあります。

 NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
                                          anItemID, @"ItemID",
                                          [NSString stringWithFormat:@"%i",q], @"Quantity",
                                          [NSString stringWithFormat:@"%@",[NSDate date]], @"BackOrderDate",
                                          [NSString stringWithFormat:@"%@", [NSDate date]],@"ModifiedOn",
                                          nil];

                    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"InventoryUpdate" object:dict]];

これを購読して、このNSDictionaryから情報を取得するにはどうすればよいですか?

私のviewDidLoadで私は持っています:

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

およびクラス内のメソッド:

- (void)recieveInventoryUpdate:(NSNotification *)notification {
    NSLog(@"%@ updated", [notification userInfo]);
}

もちろん、これはnull値をログに記録します。

23
Slee

[notification object]です

notificationWithName:object:userInfo:メソッドを使用してuserinfoを送信することもできます

34
alex-i

オブジェクトは、通知を投稿しているオブジェクトであり、オブジェクトにアクセスできるようにオブジェクトを保存する方法ではありません。ユーザー情報は、通知とともに保持する情報を保存する場所です。

[[NSNotificationCenter defaultCenter] postNotificationName:@"Inventory Update" object:self userInfo:dict];

次に、通知に登録します。オブジェクトはクラスにすることも、この名前のすべての通知を受け取るだけのnilにすることもできます。

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

次にセレクターで使用します

- (void)recieveInventoryUpdate:(NSNotification *)notification {
    NSLog(@"%@ updated", [notification userInfo]);
}
14
ColdLogic

簡単です。以下を参照してください

- (void)recieveInventoryUpdate:(NSNotification *)notification {
    NSLog(@"%@ updated",notification.object); // gives your dictionary 
    NSLog(@"%@ updated",notification.name); // gives keyname of notification

}

notification.userinfoにアクセスすると、nullが返されます。

3
Sandy

それは間違っている。使用する必要があります:

-(id)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)userInfo

dictを最後のパラメータに渡します。 「オブジェクト」パラメータは、通知を送信するオブジェクトであり、辞書ではありません。

2
Joris Mans

通知からのobjectは、senderであることが意図されています。あなたの場合、辞書は実際にはsenderではなく、単なる情報です。通知とともに送信される補助情報は、userInfoディクショナリとともに渡されることを目的としています。そのように通知を送信します。

NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
                                      anItemID, 
                                      @"ItemID",
                                      [NSString stringWithFormat:@"%i",q], 
                                      @"Quantity",
                                      [NSString stringWithFormat:@"%@", [NSDate date]], 
                                      @"BackOrderDate",
                                      [NSString stringWithFormat:@"%@", [NSDate date]],
                                      @"ModifiedOn",
                                      nil];

[[NSNotificationCenter defaultCenter] postNotification:
        [NSNotification notificationWithName:@"InventoryUpdate" 
                                      object:self 
                                    userInfo:dict]];

そして、次のように受け取り、意図した動作を適切に取得します。

- (void)recieveInventoryUpdate:(NSNotification *)notification {
    NSLog(@"%@ updated", [notification userInfo]);
}
1
PeyloW

スイフト:

// Propagate notification:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: ["info":"your dictionary"])

// Subscribe to notification:
NotificationCenter.default.addObserver(self, selector: #selector(yourSelector(notification:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)

// Your selector:
func yourSelector(notification: NSNotification) {
    if let info = notification.userInfo, let infoDescription = info["info"] as? String {
            print(infoDescription)
        } 
}

// Memory cleaning, add this to the subscribed observer class:
deinit {
    NotificationCenter.default.removeObserver(self)
}
1
Juan Boero

より簡単な方法は

-(void)recieveInventoryUpdate:(NSNotification *)notification
{
    NSLog(@"%@ updated",[notification object]);
    //Or use notification.object
}

それは私のために働いた。

0
soorej babu