ios - स्विफ्ट में NSNotificationCenter addObserver




swift (8)

स्विफ्ट में डिफ़ॉल्ट अधिसूचना केंद्र में आप पर्यवेक्षक कैसे जोड़ते हैं? मैं कोड की इस पंक्ति को बंद करने की कोशिश कर रहा हूं जो बैटरी स्तर बदलते समय अधिसूचना भेजता है।

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];

एक्सकोड 8 में स्विफ्ट 3.0

स्विफ्ट 3.0 ने कई "स्ट्रिंग-टाइपेड" एपीआई को struct "रैपर प्रकार" के साथ बदल दिया है, जैसा अधिसूचना केंद्र के मामले में है। अधिसूचनाओं को String द्वारा बजाए एक struct Notfication.Name से पहचाना जाता है। स्विफ्ट 3 गाइड के लिए माइग्रेटिंग देखें।

पिछला उपयोग:

// Define identifier
let notificationIdentifier: String = "NotificationIdentifier"

// Register to receive notification
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification(_:)), name: notificationIdentifier, object: nil)

// Post a notification
NSNotificationCenter.defaultCenter().postNotificationName(notificationIdentifier, object: nil)

नया स्विफ्ट 3.0 उपयोग:

// Define identifier
let notificationName = Notification.Name("NotificationIdentifier")

// Register to receive notification
NotificationCenter.default.addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification), name: notificationName, object: nil)

// Post notification
NotificationCenter.default.post(name: notificationName, object: nil)

सिस्टम अधिसूचना प्रकारों को अब Notification.Name पर स्थिर स्थिरांक के रूप में परिभाषित किया गया है। नाम; यानी .UIDeviceBatteryLevelDidChange , .UIApplicationDidFinishLaunching , .UITextFieldTextDidChange , आदि

सिस्टम अधिसूचनाओं के अनुरूप बने रहने के लिए आप अपनी खुद की कस्टम Notification.Name साथ Notification.Name विस्तार कर सकते हैं:

// Definition:
extension Notification.Name {
    static let yourCustomNotificationName = Notification.Name("yourCustomNotificationName")
}

// Usage:
NotificationCenter.default.post(name: .yourCustomNotificationName, object: nil)

स्विफ्ट 4.0 और एक्सकोड 9.0+:

भेजें (पोस्ट) अधिसूचना:

NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: nil)

या

NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: nil, userInfo: ["Renish":"Dadhaniya"])

प्राप्त करें (प्राप्त करें) अधिसूचना:

NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)

प्राप्त अधिसूचना के लिए फंक्शन-विधि हैंडलर:

@objc func methodOfReceivedNotification(notification: Notification){

}

स्विफ्ट 3.0 और एक्सकोड 8.0+:

भेजें (पोस्ट) अधिसूचना:

NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: nil)

प्राप्त करें (प्राप्त करें) अधिसूचना:

NotificationCenter.default.addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)

प्राप्त अधिसूचना के लिए विधि हैंडलर:

func methodOfReceivedNotification(notification: Notification){
        //Take Action on Notification
 }

अधिसूचना हटाएं:

deinit {
       NotificationCenter.default.removeObserver(self, name: Notification.Name("NotificationIdentifier"), object: nil)
    }

स्विफ्ट 2.3 और एक्सकोड 7:

भेजें (पोस्ट) अधिसूचना

    NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)

अधिसूचना प्राप्त करें (प्राप्त करें)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification(_:)), name:"NotificationIdentifier", object: nil)

प्राप्त अधिसूचना के लिए विधि हैंडलर

func methodOfReceivedNotification(notification: NSNotification){
    //Take Action on Notification
}

ऐतिहासिक एक्सकोड संस्करणों के लिए ...

भेजें (पोस्ट) अधिसूचना

NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)

अधिसूचना प्राप्त करें (प्राप्त करें)

NSNotificationCenter.defaultCenter().addObserver(self, selector: "methodOfReceivedNotification:", name:"NotificationIdentifier", object: nil)

अधिसूचना हटाएं

NSNotificationCenter.defaultCenter().removeObserver(self, name: "NotificationIdentifier", object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self) // Remove from all notifications being observed

प्राप्त अधिसूचना के लिए विधि हैंडलर

func methodOfReceivedNotification(notification: NSNotification){
    //Take Action on Notification
}

@objc के साथ कक्षा या लक्ष्य विधि को एनोटेट करें

@objc private func methodOfReceivedNotification(notification: NSNotification){
    //Take Action on Notification
}

//Or

dynamic private func methodOfReceivedNotification(notification: NSNotification){
    //Take Action on Notification
}

ऐसा करने का एक अच्छा तरीका addObserver(forName:object:queue:using:) addObserver(_:selector:name:object:) विधि के बजाय addObserver(forName:object:queue:using:) विधि addObserver(forName:object:queue:using:) है जिसे अक्सर उद्देश्य-सी कोड से उपयोग किया जाता है। पहले संस्करण का लाभ यह है कि आपको अपनी विधि पर @objc विशेषता का उपयोग करने की आवश्यकता नहीं है:

    func batteryLevelChanged(notification: Notification) {
        // do something useful with this information
    }

    let observer = NotificationCenter.default.addObserver(
        forName: NSNotification.Name.UIDeviceBatteryLevelDidChange,
        object: nil, queue: nil,
        using: batteryLevelChanged)

और यदि आप चाहें तो आप विधि के बजाय एक बंद करने का भी उपयोग कर सकते हैं:

    let observer = NotificationCenter.default.addObserver(
        forName: NSNotification.Name.UIDeviceBatteryLevelDidChange,
        object: nil, queue: nil) { _ in print("🔋") }

बाद में अधिसूचना सुनने के लिए आप लौटे हुए मूल्य का उपयोग कर सकते हैं:

    NotificationCenter.default.removeObserver(observer)

इस विधि का उपयोग करने में एक और फायदा होता था, जो कि आपको चयनकर्ता तारों का उपयोग करने की आवश्यकता नहीं होती है जिसे संकलक द्वारा स्थिर रूप से चेक नहीं किया जा सकता था और यदि विधि का नाम बदल दिया गया तो टूटने के लिए नाजुक थे, लेकिन स्विफ्ट 2.2 और बाद में #selector अभिव्यक्तियों को शामिल करें जो उस समस्या को ठीक करते हैं।


मैं चयनकर्ता का सफलतापूर्वक उपयोग करने के लिए निम्नलिखित में से एक करने में सक्षम हूं - @objc के साथ कुछ भी टिप्पणी किए बिना :

NSNotificationCenter.defaultCenter().addObserver(self,
    selector:"batteryLevelChanged:" as Selector,
    name:"UIDeviceBatteryLevelDidChangeNotification",
    object:nil)    

या

let notificationSelector: Selector = "batteryLevelChanged:"

NSNotificationCenter.defaultCenter().addObserver(self,
    selector: notificationSelector,
    name:"UIDeviceBatteryLevelDidChangeNotification",
    object:nil)    

मेरा xcrun संस्करण स्विफ्ट 1.2 दिखाता है, और यह एक्सकोड 6.4 और एक्सकोड 7 बीटा 2 पर काम करता है (जो मैंने सोचा कि स्विफ्ट 2.0 का उपयोग करेगा):

$xcrun swift --version

Apple Swift version 1.2 (swiftlang-602.0.53.1 clang-602.0.53)

स्विफ्ट 2.2 - #selector 7.3 में, हम #selector लिए NSNotificationCenter #selector उपयोग करते हैं

 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(rotate), name: UIDeviceOrientationDidChangeNotification, object: nil)

हमें अधिसूचना को भी हटा देना चाहिए।

पूर्व।

deinit 
{
  NotificationCenter.default.removeObserver(self, name:NSNotification.Name(rawValue: "notify"), object: nil)

}

आईएसओ 11 के लिए स्विफ्ट 4.0 में NSNotificationCenter पर्यवेक्षक वाक्यविन्यास जोड़ें

  NotificationCenter.default.addObserver(self, selector: #selector(keyboardShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

यह कीबोर्ड WillShow अधिसूचना नाम प्रकार के लिए है। उपलब्ध विकल्प से अन्य प्रकार का चयन किया जा सकता है

चयनकर्ता प्रकार @objc func है जो कुंजीपटल दिखाएगा कि यह कैसे होगा (यह आपका उपयोगकर्ता फ़ंक्शन है)


स्विफ्ट 3 में, एक्सकोड 8.2: - बैटरी स्थिति स्तर की जांच

//Add observer
NotificationCenter.default.addObserver(self, selector: #selector(batteryStateDidChange), name: NSNotification.Name.UIDeviceBatteryStateDidChange, object: nil)


 //Fired when battery level changes

 func batteryStateDidChange(notification: NSNotification){
        //perform manipulation here
    }






nsnotificationcenter