NSNotificationCenter addObserver in Swift

后端 未结 14 1995
难免孤独
难免孤独 2020-11-22 05:23

How do you add an observer in Swift to the default notification center? I\'m trying to port this line of code that sends a notification when the battery level changes.

相关标签:
14条回答
  • 2020-11-22 06:27

    Pass Data using NSNotificationCenter

    You can also pass data using NotificationCentre in swift 3.0 and NSNotificationCenter in swift 2.0.

    Swift 2.0 Version

    Pass info using userInfo which is a optional Dictionary of type [NSObject : AnyObject]?

    let imageDataDict:[String: UIImage] = ["image": image]
    
    // Post a notification
     NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil, userInfo: imageDataDict)
    
    // Register to receive notification in your class
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: notificationName, object: nil)
    
    // handle notification
    func showSpinningWheel(notification: NSNotification) {
      if let image = notification.userInfo?["image"] as? UIImage {
      // do something with your image   
      }
    }
    

    Swift 3.0 Version

    The userInfo now takes [AnyHashable:Any]? as an argument, which we provide as a dictionary literal in Swift

    let imageDataDict:[String: UIImage] = ["image": image]
    
    // post a notification
     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict) 
    // `default` is now a property, not a method call
    
    // Register to receive notification in your class
    NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)
    
    // handle notification
    func showSpinningWheel(_ notification: NSNotification) {
    
      if let image = notification.userInfo?["image"] as? UIImage {
      // do something with your image   
      }
    }
    

    Source pass data using NotificationCentre(swift 3.0) and NSNotificationCenter(swift 2.0)

    0 讨论(0)
  • 2020-11-22 06:29

    In Swift 5

    Let's say if want to Receive Data from ViewControllerB to ViewControllerA

    ViewControllerA (Receiver)

    import UIKit
    
    class ViewControllerA: UIViewController  {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //MARK: - - - - - Code for Passing Data through Notification Observer - - - - -
            // add observer in controller(s) where you want to receive data
            NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
        }
    
        //MARK: - - - - - Method for receiving Data through Post Notificaiton - - - - -
        @objc func methodOfReceivedNotification(notification: Notification) {
            print("Value of notification : ", notification.object ?? "")
        }
    }
    

    ViewControllerB (Sender)

    import UIKit
    
    class ViewControllerB: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //MARK: - - - - - Set data for Passing Data Post Notification - - - - -
            let objToBeSent = "Test Message from Notification"
            NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题