سؤال

أحاول الحصول على مثيل واحد لاستخدامه NSNotificationCenter مع addObserver و postNotificationName لكن لا يمكنني معرفة سبب عدم عمله.

لدي سطرين إلى رمز لإضافة المراقب وإرسال الرسالة في فئتين مختلفتين

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

و

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];

إذا قمت بتعيين الاسم على nil إنه يعمل بشكل جيد لأنه مجرد بث ، عندما أحاول تحديد اسم إشعار لا تمر به الرسائل أبدًا.

هل كانت مفيدة؟

المحلول

كل رمز الخاص بي يستخدم NSNotifications مثل ذلك:

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

[[NSNotificationCenter defaultCenter] postNotificationName:@"ScanCompleted" object:nil];

الأول هو تسجيل الإخطار والنشر الثاني للإشعار.

نصائح أخرى

في الأساس ، كل ما يتعلق بترتيب التنفيذ. إذا قمت بتنفيذ postNotificationName قبل AddObserver ، فهذه مشكلة سهلة. استخدم نقاط التوقف والخطوة من خلال الرمز :)

يجب أن تتوقف نقطة التوقف الأولى هنا:

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

ثم هنا:

[[NSNotificationCenter defaultCenter]postNotificationName:@"ScanCompleted" object:self];

أيضا ، تأكد من أن المحدد لديه القولون. لأنه توقيع الأسلوب سيكون:

- (void)updateView:(NSNotification *)notification;

كان لي نفس المشكلة. والسبب هو أنني اتصلت بـ RemoveObserver Method في

- (void)viewDidDisappear:(BOOL)animated{

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

   [notificationCenter removeObserver:self];

}

لذا تحقق مما إذا كنت قد اتصلت بـ RemoveObserver قبل التحويل.

نصائح: يمكنك البحث في الكلمة الرئيسية "removeObserver" للعثور على ما إذا كنت قد استدعت هذه الوظيفة.

غير هذا:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];

الى هذا:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil];

إذا تم تسجيل إخطارك الأول بشكل صحيح ، فيجب استدعاء NewEventloaded.

واجهت مشكلة مماثلة وكانت مشكلتي بسبب الإخطار الذي يتم استدعاؤه في موضوع آخر. هذا حل مشكلتي.

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
});

هل جربت أي أسماء أخرى ولكن @"حدث" و NIL؟ فقط للتأكد ، يمكنك تحديد أسماء الأحداث الخاصة بك في ملف واحد وتضمين ذلك في كل من تسجيل الإخطار وإرساله. علي سبيل المثال:

الملف الاساسي:

extern NSString * const NOTE_myEventName;

مصدر الملف:

NSString * const NOTE_myEventName = @"MyEventName";

تسجيل:

[[NSNotificationCenter defaultCenter]
 addObserver:self
    selector:@selector(handleMyEvent:)
        name:NOTE_myEventName
      object:nil];

إرسال الإخطار:

[[NSNotificationCenter defaultCenter]
    postNotificationName:NOTE_myEventName object:nil];

لقد أصلحت بنجاح "NSNotification لا يتم إرسالها عندما postNotificationName: يسمى "تحطم.

لقد وجدت أن الخطأ الحقيقي في معالج رسائل الإخطار.

ال postNotificationName و addObserver كلها على صواب مثل أول وظيفة من هذا الموضوع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top