এনএসএনটিফিকেশন সেন্টার দিয়ে কীভাবে অবজেক্ট পাস করবেন


129

আমি আমার অ্যাপের প্রতিনিধি থেকে অন্য ক্লাসের কোনও বিজ্ঞপ্তি গ্রহণকারীকে কোনও বস্তুটি পাস করার চেষ্টা করছি।

আমি পূর্ণসংখ্যা প্রেরণ করতে ইচ্ছুক messageTotal। এখনই আমার আছে:

রিসিভারে:

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

বিজ্ঞপ্তিটি করছে এমন শ্রেণিতে:

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

তবে আমি messageTotalঅন্য শ্রেণীর কাছে বস্তুটি পাস করতে চাই ।


উত্তর:


235

আপনাকে "ইউজারআইএনফো" রূপটি ব্যবহার করতে হবে এবং একটি এনএসডেটরিজ অবজেক্টটি পাস করতে হবে যাতে বার্তাটি মোট পূর্ণসংখ্যা রয়েছে:

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

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

প্রাপ্তির শেষে আপনি ব্যবহারকারীর তথ্য অভিধানটি অ্যাক্সেস করতে পারেন:

-(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);
    }
}

ধন্যবাদ, আমি messageTotalএকটি ইউআইবাটনে একটি ব্যাজ সেট করছি , আপনি কি জানেন যে আমি কীভাবে নতুন ব্যাজ গণনা দিয়ে বোতামটি রিফ্রেশ করতে পারি? চিত্রটি প্রদর্শনের কোডটি viewDidLoadহ'লUIBarButtonItem *eRXButton = [BarButtonBadge barButtonWithImage:buttonImage badgeString:@"1" atRight:NO toTarget:self action:@selector(eRXButtonPressed)];
জন

আপনার কেন নোটিফিকেশন.নামের তুলনা করা দরকার তা আমি নিশ্চিত নই। আপনি যখন addObserver () করেন তখন নামের মানচিত্রটি সম্পাদন করা উচিত। কোনও নির্দিষ্ট বিজ্ঞপ্তি পর্যবেক্ষণ করার সময়ই প্রাপ্তিস্টেস্টনোটিকেশন কল করা উচিত।
জোহান কার্লসন

1
জোহান, এই সাধারণ ক্ষেত্রে আপনি সঠিক, তবে একাধিক বিজ্ঞপ্তি একই হ্যান্ডলারটি ট্রিগার করা সম্ভব
লাইটিক

93

প্রদত্ত সমাধানটির উপর ভিত্তি করে আমি ভেবেছিলাম আপনার নিজস্ব কাস্টম ডেটা অবজেক্ট (যা আমি এখানে প্রশ্ন হিসাবে 'বার্তা' হিসাবে উল্লেখ করেছি) পাস করার উদাহরণ দেখানো সহায়ক হতে পারে।

ক্লাস এ (প্রেরক):

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

ক্লাস বি (রিসিভার):

- (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
    }
}

2
কেন এই উত্তরটির আরও বেশি অগ্রাধিকার নেই ?! এটি পুরোপুরি কাজ করে এবং একটি হ্যাক না!
রূবেঁ ট্যানার

4
@ কায়রোস কারণ এটি এটি ব্যবহারের জন্য ডিজাইন করা হয়নি। objectPARAM মধ্যে postNotificationName এক যা এই বিজ্ঞপ্তি পাঠাতে অর্থ করা উচিত নয়।
xi.lin

2
হ্যাঁ প্যারামটি ব্যবহার করে অবজেক্টটি এনএসডি অভিধান হিসাবে পাস করা উচিত userInfoএবং উপরের স্বীকৃত উত্তরগুলি এখন এটি দেখানোর জন্য সম্পাদনা করা হয়েছে।
ডেভিড ডগলাস

1
এটি খুব বিভ্রান্তিকর, কেন এই উত্তরে এতগুলি উত্সাহ দেওয়া হয়েছে? এটি মুছে ফেলা উচিত। প্রত্যেকের ব্যবহারকারীর তথ্য ব্যবহার করা উচিত যা এর জন্য ঠিক তৈরি হয়েছিল।
শিনিক্স 21

ঠিক আছে, প্রতিক্রিয়ার জন্য ধন্যবাদ ... আমি userInfoঅভিধানটি অবজেক্টের ডেটা পাস করার উপায় হিসাবে ব্যবহার করার উত্তর আপডেট করেছি ।
ডেভিড ডগলাস

27

সুইফট 2 সংস্করণ

@ জোহান কার্লসন যেমন উল্লেখ করেছেন ... আমি এটি ভুল করছিলাম। এনএসএনটিফিকেশন সেন্টারের সাথে তথ্য প্রেরণ এবং গ্রহণের সঠিক উপায় এখানে।

প্রথমত, আমরা পোস্টনোটিকেশননামের জন্য আরম্ভকারীটিকে দেখি:

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

উৎস

আমরা userInfoপ্যারাম ব্যবহার করে আমাদের তথ্য দিয়ে যাব । [NSObject : AnyObject]ধরনের একটি হোল্ড-ওভার থেকে উদ্দেশ্য সি । সুতরাং, সুইফ্ট জমিতে, আমাদের যা করতে হবে তা হল একটি সুইফট অভিধানে পাস করা যাতে কীগুলি রয়েছে যা থেকে উত্পন্ন হয়েছে NSObjectএবং মানগুলি হতে পারে AnyObject

সেই জ্ঞানের সাহায্যে আমরা একটি অভিধান তৈরি করি যা আমরা objectপ্যারামিটারে প্রবেশ করব :

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

তারপরে আমরা অভিধানটি আমাদের অবজেক্ট প্যারামিটারে পাস করি।

প্রেরকের

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

রিসিভার ক্লাস

প্রথমে আমাদের নিশ্চিত করতে হবে যে আমাদের ক্লাসটি বিজ্ঞপ্তির জন্য পর্যবেক্ষণ করছে

override func viewDidLoad() {
    super.viewDidLoad()

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

তারপরে আমরা আমাদের অভিধানটি গ্রহণ করতে পারি:

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

আপনি আসলে পোস্টনোটিকেশননাম () এর উদ্দেশ্যযুক্ত ব্যবহার লঙ্ঘন করছেন। তবে আপনি একা নন। আমি অনেক বিকাশকারী ব্যবহারকারীর বস্তু প্রেরণের জন্য অবজেক্ট প্যারামিটার ব্যবহার করে দেখেছি। দ্বিতীয় যুক্তি, বস্তুটি প্রেরকের জন্য সংরক্ষিত। সব ধরণের অবজেক্ট প্রেরণ করার জন্য আপনার সত্যই ব্যবহারকারীর ইনফো উচিত should অন্যথায় আপনি এলোমেলো ক্রাশ ইত্যাদির মুখোমুখি হতে পারেন
জোহান কার্লসন

25

সুইফট 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"]
}

বোনাস (আপনার অবশ্যই করা উচিত!):

প্রতিস্থাপন Notification.Name("SomeNotificationName")সঙ্গে .someNotificationName:

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

প্রতিস্থাপন "key0"এবং "key1"সঙ্গে Notification.Key.key0এবং Notification.Key.key1:

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

কেন আমি অবশ্যই এটি করব? ব্যয়বহুল টাইপ ত্রুটিগুলি এড়াতে, পুনর্নামকরণ উপভোগ করুন, ব্যবহারগুলি উপভোগ করুন ইত্যাদি উপভোগ করুন ...


ধন্যবাদ। স্পষ্টতই বিজ্ঞপ্তি প্রসারিত করা হচ্ছে.নাম সম্ভব তবে বিজ্ঞপ্তি নয় .কি। 'Key' is not a member type of 'Notification'। এখানে দেখুন: https://ibb.co/hDQYbd2
alpennec

আপনাকে ধন্যবাদ, মনে হচ্ছে Keyস্ট্রাক্টটি তখন থেকেই মুছে ফেলা হয়েছে। আমি উত্তরটি আপডেট করছি
ফুরো

1

সুইফ্ট 5.1 কাস্টম অবজেক্ট / প্রকার

// MARK: - NotificationName
// Extending notification name to avoid string errors.
extension Notification.Name {
    static let yourNotificationName = Notification.Name("yourNotificationName")
}


// MARK: - CustomObject
class YourCustomObject {
    // Any stuffs you would like to set in your custom object as always.
    init() {}
}

// MARK: - Notification Sender Class
class NotificatioSenderClass {

     // Just grab the content of this function and put it to your function responsible for triggering a notification.
    func postNotification(){
        // Note: - This is the important part pass your object instance as object parameter.
        let yourObjectInstance = YourCustomObject()
        NotificationCenter.default.post(name: .yourNotificationName, object: yourObjectInstance)
    }
}

// MARK: -Notification  Receiver class
class NotificationReceiverClass: UIViewController {
    // MARK: - ViewController Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        // Register your notification listener
        NotificationCenter.default.addObserver(self, selector: #selector(didReceiveNotificationWithCustomObject), name: .yourNotificationName, object: nil)
    }

    // MARK: - Helpers
    @objc private func didReceiveNotificationWithCustomObject(notification: Notification){
        // Important: - Grab your custom object here by casting the notification object.
        guard let yourPassedObject = notification.object as? YourCustomObject else {return}
        // That's it now you can use your custom object
        //
        //

    }
      // MARK: - Deinit
  deinit {
      // Save your memory by releasing notification listener
      NotificationCenter.default.removeObserver(self, name: .yourNotificationName, object: nil)
    }




}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.