2016-07-11 17 views
7

क्या नई सूचनाएं वर्तमान में स्विफ्ट 3 में काम नहीं कर रही हैं? मैं कर रहा हूँ:स्विफ्ट में एनएसएनोटिफिकेशन 3

NotificationCenter.default().post(name: DidTouchParticleView, 
            object: self.particle as? AnyObject) 
एक कस्टम दृश्य के touchesBegan() में

और मैं दृश्य नियंत्रक से particle वस्तु भेजने के लिए अगर वहाँ एक है की जरूरत है। तो मैं यह करता हूं:

NotificationCenter.default().addObserver(forName: DidTouchParticleView, 
             object: self, 
             queue: OperationQueue.main(), 
             using: presentParticleDisplayView(notification:)) 

दृश्य नियंत्रक के दृश्य में DidLoad()। मुझे यकीन है कि जब मैं अपना कस्टम व्यू टैप करता हूं तो उस विशेष दृश्य नियंत्रक को प्रस्तुत किया जाता है, हालांकि, फ़ंक्शन presentParticleDisplayView(notification:) फ़ंक्शन कभी नहीं कहा जाता है।

इसके अलावा, DidTouchParticleView इस तरह विश्व स्तर पर परिभाषित किया गया है:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 

बीटा को यह कारण है, या मैं कुछ गलत कर रहा हूँ?

+0

वर्तमान बीटा में, और स्विफ्ट 3 में आगे बढ़ते हुए, 'डिफ़ॉल्ट()' के बाद कोष्ठक हटा दिए जाते हैं; यह 'NotificationCenter.default' है। – matt

उत्तर

11

ऐसा लगता है कि आप addObserver(_:selector:name:object:) पर कॉल करने का इरादा रखते हैं, जहां दूसरा पैरामीटर संदेश (selector:) पहले पैरामीटर (लक्ष्य) पर भेजा जाता है।

इसके बजाय, आप गलत विधि, addObserver(forName:object:queue:using:) पर कॉल कर रहे हैं, जो काफी अलग तरीके से काम करता है।

इसके अलावा

, आपके सवाल का दूसरा भाग के रूप में:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 

यह सही (लगभग) है, यह

let DidTouchParticleView = Notification.Name("didTouchParticleView") 

सभी अधिसूचना नाम अब Notification.Name उदाहरण हैं।

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

तब आप अपने कोड भर .didTouchParticleView के रूप में अधिसूचना के नाम का उल्लेख कर सकते हैं: यह करने के लिए उचित तरीके से कहने के लिए है।

1

आप अधिसूचना पोस्ट करने के लिए स्वयं को देख रहे हैं (object: self)। addObserver कॉल में शायद आपको object: particle या संभवतः object: nil जैसे कुछ का मतलब है (लेकिन फिर यह सुनिश्चित करने के लिए सावधान रहें कि यह हैंडलर में सही कण है)। इस विधि के लिए दस्तावेज़ों को दोबारा पढ़ें और ध्यान दें कि object पैरामीटर क्या है।

ध्यान दें कि addObserver का यह संस्करण एक पर्यवेक्षक ऑब्जेक्ट देता है। आपको इसे स्टोर करना होगा ताकि आप बाद में removeObserver पर कॉल कर सकें।

+0

'ऑब्जेक्ट' को शून्य में बदलना इसे हल करता है। हालांकि, यह कैसे पता चलता है कि पर्यवेक्षक क्या बन गया है? इससे पहले, स्विफ्ट 2 में, 'addObserver' होता था, जो ऑब्जेक्टर्स के रूप में ऑब्जेक्ट लेता है। –

+1

@YoussefSami नहीं, आपको समझ में नहीं आया कि पहले क्या हो रहा था। 'ऑब्जेक्ट' पर्यवेक्षक _never_ था। पर्यवेक्षक कॉल से _returned_ है। इसे 'addObserver (_: selector: name: object:)' के साथ भ्रमित न करें, जहां पहला पैरामीटर _is_ पर्यवेक्षक है। अब मेरा संपादित उत्तर देखें। – matt

+0

@ मैट हां, यही वह है जिसके लिए मैं जिक्र कर रहा था। तो अधिसूचना केंद्र अब अधिसूचना भेजने के लिए किस वस्तु को जानता है? –