webentwicklung-frage-antwort-db.com.de

So übergeben Sie ein Objekt mit NSNotificationCenter

Ich versuche, ein Objekt von meinem App-Delegaten an einen Benachrichtigungsempfänger in einer anderen Klasse zu übergeben.

Ich möchte eine Ganzzahl messageTotal übergeben. Gerade habe ich:

Im Empfänger:

- (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];

In der Klasse, die die Benachrichtigung durchführt:

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

Aber ich möchte das Objekt messageTotal an die andere Klasse übergeben.

121
Jon

Sie müssen die Variante "userInfo" verwenden und ein NSDictionary-Objekt übergeben, das die Ganzzahl messageTotal enthält:

NSDictionary* userInfo = @{@"total": @(messageTotal)};

NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@"eRXReceived" object:self userInfo:userInfo];

Auf der empfangenden Seite können Sie wie folgt auf das userInfo-Wörterbuch zugreifen:

-(void) receiveTestNotification:(NSNotification*)notification
{
    if ([notification.name isEqualToString:@"TestNotification"])
    {
        NSDictionary* userInfo = notification.userInfo;
        NSNumber* total = (NSNumber*)userInfo[@"total"];
        NSLog (@"Successfully received test notification! %i", total.intValue);
    }
}
225
LearnCocos2D

Aufbauend auf der bereitgestellten Lösung hielt ich es für hilfreich, ein Beispiel für die Weitergabe Ihres eigenen benutzerdefinierten Datenobjekts zu zeigen (auf das ich hier laut Frage als "Nachricht" verwiesen habe).

Klasse A (Absender):

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

Klasse B (Empfänger):

- (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
    }
}
89
David Douglas

Swift 2 Version

Wie @Johan Karlsson betonte ... Ich habe es falsch gemacht. Hier ist die richtige Methode zum Senden und Empfangen von Informationen mit NSNotificationCenter.

Zuerst betrachten wir den Initialisierer für postNotificationName:

init(name name: String,
   object object: AnyObject?,
 userInfo userInfo: [NSObject : AnyObject]?)

Quelle

Wir übergeben unsere Informationen mit dem userInfo -Parameter. Das [NSObject : AnyObject] type ist ein Hold-Over von Objective-C. In Swift land müssen wir nur ein Swift dictionary übergeben, dessen Schlüssel von NSObject und Werten abgeleitet sind Das kann AnyObject sein.

Mit diesem Wissen erstellen wir ein Wörterbuch, das wir an den Parameter object übergeben:

 var userInfo = [String:String]()
 userInfo["UserName"] = "Dan"
 userInfo["Something"] = "Could be any object including a custom Type."

Dann übergeben wir das Wörterbuch an unseren Objektparameter.

Absender

NSNotificationCenter.defaultCenter()
    .postNotificationName("myCustomId", object: nil, userInfo: userInfo)

Empfängerklasse

Zuerst müssen wir sicherstellen, dass unsere Klasse die Benachrichtigung beachtet

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("btnClicked:"), name: "myCustomId", object: nil)   
}

Dann können wir unser Wörterbuch erhalten:

func btnClicked(notification: NSNotification) {
   let userInfo : [String:String!] = notification.userInfo as! [String:String!]
   let name = userInfo["UserName"]
   print(name)
}
24
Dan Beaulieu

Swift 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"]
}

Bonus (den Sie unbedingt machen sollten!):

Ersetzen Sie Notification.Name("SomeNotificationName") durch .someNotificationName:

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

Ersetzen Sie "key0" Und "key1" Durch Notification.Key.key0 Und Notification.Key.key1:

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

Warum sollte ich das auf jeden Fall tun? Um kostspielige Tippfehler zu vermeiden, viel Spaß beim Umbenennen, beim Auffinden von Verwendungsmöglichkeiten usw.

17
frouo