Ich versuche, ein Objekt von meinem App-Delegaten an einen Benachrichtigungsempfänger in einer anderen Klasse zu übergeben.
Ich möchte eine Ganzzahl übergeben messageTotal
. 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 ausführt:
[UIApplication sharedApplication].applicationIconBadgeNumber = messageTotal;
[[NSNotificationCenter defaultCenter] postNotificationName:@"eRXReceived" object:self];
Aber ich möchte das Objekt messageTotal
an die andere Klasse übergeben.
Antworten:
Sie müssen die Variante "userInfo" verwenden und ein NSDictionary-Objekt übergeben, das die Ganzzahl messageTotal enthält:
Auf der Empfangsseite können Sie wie folgt auf das userInfo-Wörterbuch zugreifen:
quelle
messageTotal
ein Abzeichen auf einem UIButton. Wissen Sie, wie ich die Schaltfläche mit der neuen Abzeichenanzahl aktualisieren kann? Der Code, um das Bild anzuzeigen,viewDidLoad
istUIBarButtonItem *eRXButton = [BarButtonBadge barButtonWithImage:buttonImage badgeString:@"1" atRight:NO toTarget:self action:@selector(eRXButtonPressed)];
Aufbauend auf der bereitgestellten Lösung hielt ich es für hilfreich, ein Beispiel zu zeigen, das Ihr eigenes benutzerdefiniertes Datenobjekt übergibt (auf das ich hier gemäß Frage als "Nachricht" verwiesen habe).
Klasse A (Absender):
Klasse B (Empfänger):
quelle
object
Parameter inpostNotificationName
sollte denjenigen bedeuten, der diese Benachrichtigung sendet.userInfo
Parameter als NSDictionary übergeben werden, und die oben akzeptierte Antwort wurde jetzt bearbeitet, um dies anzuzeigen.userInfo
Wörterbuch als Übergabe der Objektdaten zu verwenden.Wie @Johan Karlsson betonte ... Ich habe es falsch gemacht. Hier ist der richtige Weg, um Informationen mit NSNotificationCenter zu senden und zu empfangen.
Zuerst betrachten wir den Initialisierer für postNotificationName:
Quelle
Wir geben unsere Informationen mit dem
userInfo
Parameter weiter. Der[NSObject : AnyObject]
Typ ist ein Überbleibsel von Objective-C . In Swift Land müssen wir also nur ein Swift-Wörterbuch übergeben, das Schlüssel enthält, von denen abgeleitet wird,NSObject
und Werte, die sein könnenAnyObject
.Mit diesem Wissen erstellen wir ein Wörterbuch, das wir an den
object
Parameter übergeben:Dann übergeben wir das Wörterbuch an unseren Objektparameter.
Absender
Empfängerklasse
Zuerst müssen wir sicherstellen, dass unsere Klasse die Benachrichtigung beobachtet
Dann können wir unser Wörterbuch erhalten:
quelle
Swift 5
Bonus (das sollten Sie unbedingt tun!):
Ersetzen
Notification.Name("SomeNotificationName")
durch.someNotificationName
:Ersetzen
"key0"
und"key1"
durchNotification.Key.key0
undNotification.Key.key1
:Warum sollte ich das definitiv tun? Um kostspielige Tippfehler zu vermeiden, genießen Sie das Umbenennen, die Verwendung usw.
quelle
'Key' is not a member type of 'Notification'
. Siehe hier: https://ibb.co/hDQYbd2Key
struct seitdem entfernt wurde. Ich aktualisiere die AntwortSwift 5.1 Benutzerdefiniertes Objekt / Typ
quelle