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値をログに記録します。
[notification object]
です
notificationWithName:object:userInfo:
メソッドを使用してuserinfoを送信することもできます
オブジェクトは、通知を投稿しているオブジェクトであり、オブジェクトにアクセスできるようにオブジェクトを保存する方法ではありません。ユーザー情報は、通知とともに保持する情報を保存する場所です。
[[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]);
}
簡単です。以下を参照してください
- (void)recieveInventoryUpdate:(NSNotification *)notification {
NSLog(@"%@ updated",notification.object); // gives your dictionary
NSLog(@"%@ updated",notification.name); // gives keyname of notification
}
notification.userinfo
にアクセスすると、null
が返されます。
それは間違っている。使用する必要があります:
-(id)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)userInfo
dictを最後のパラメータに渡します。 「オブジェクト」パラメータは、通知を送信するオブジェクトであり、辞書ではありません。
通知からの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]);
}
スイフト:
// 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)
}
より簡単な方法は
-(void)recieveInventoryUpdate:(NSNotification *)notification
{
NSLog(@"%@ updated",[notification object]);
//Or use notification.object
}
それは私のために働いた。