2012-09-10 21 views
5

में यूआई नियंत्रण से अधिसूचनाएं प्राप्त करने वाले कई वर्ग मुझे समझते हैं कि यूआईटीएक्स्टफिल्ड जैसे यूआई नियंत्रण अपने प्रतिनिधि के माध्यम से क्लाइंट इंटरैक्शन/घटनाओं के बारे में सूचित करते हैं, जिसे आवश्यक प्रोटोकॉल का समर्थन करने वाली कक्षा के रूप में परिभाषित किया जाता है।मल्टीकास्ट प्रतिनिधियों - आईओएस

मुझे अक्सर एक से अधिक कक्षा में यूआई कार्यक्रम की अधिसूचनाएं प्राप्त करना चाहती है, इसलिए मल्टीकास्टिंग का समर्थन करना चाहूंगा। उदाहरण के लिए, यूआई नियंत्रण के लिए एक से अधिक प्रतिनिधि निर्दिष्ट करना। मुझे पूरा यकीन है कि आईओएस फ्रेमवर्क सुविधा नहीं है जो इसका समर्थन करती है। मैं सोच रहा था कि क्या कोई इस समस्या के लिए एक सभ्य समाधान के साथ आया था?

उत्तर

6

एक कोको सुविधा है जो आपको मल्टीकास्ट प्रतिनिधियों को सापेक्ष आसानी से बनाने की सुविधा देती है - यह फ्रेमवर्क में निर्मित Message Forwarding सिस्टम है।

एक कक्षा बनाएं जो forwardInvocation: ओवरराइड करता है, और एक प्रतिनिधि के बजाय आपके ऑब्जेक्ट का एक उदाहरण देता है। इसे कभी-कभी "ट्रैम्पोलिन ऑब्जेक्ट" कहा जाता है। आपके forwardInvocation: कार्यान्वयन के अंदर तर्क अब यह तय कर सकता है कि कौन से "असली" ऑब्जेक्ट्स संदेश प्राप्त करना चाहिए, और उनमें से एक या अधिक में आमंत्रण अग्रेषित करना चाहिए।

इस स्वीकार किए जाते हैं जवाब के लिए एक अद्यतन के रूप में, मैं अपने खुद के मल्टीकास्टिंग प्रतिनिधि कार्यान्वयन यहाँ बनाया:

http://www.scottlogic.co.uk/blog/colin/2012/11/a-multicast-delegate-pattern-for-ios-controls/

+0

है कि मैं के बारे में पता नहीं था एक बहुत ही दिलचस्प भाषा सुविधा पर प्रकाश डाला के लिए धन्यवाद:

कार्यान्वयन यहाँ देखें। मुझे लगता है कि मैं इसका निर्माण कर सकता हूं जो मुझे इसका उपयोग करने की आवश्यकता है। – ColinE

+0

कॉलिन के उदाहरण में, गायब बात यह है कि आपको इसे जोड़ने की आवश्यकता है: हस्ताक्षर = [एनएसएम विधि हस्ताक्षर हस्ताक्षर WithObjCTypes: "@^v^c"]; करने के लिए (NSMethodSignature *) विधि सिग्नेचरफॉर चयनकर्ता: (एसईएल) एक चयनकर्ता विधि। – iosDeveloper

1

आप अपने वर्ग में अपने यूआई नियंत्रण लागू कर सकता है, और फिर अपने वर्ग इस यूआई से सूचना प्राप्त होगी , आप किसी अन्य वर्ग को संदेश भेज सकते हैं (एक ही प्रतिनिधि तकनीकी का उपयोग कर - प्रथम श्रेणी में प्रतिनिधि संपत्ति लागू करें, और फिर दूसरी कक्षा में 1-वर्ग वर्ग से प्रतिनिधि विधि लागू करें)। उदाहरण के लिए, UITextField विधि -textFieldDidEndEditing के लिए:

प्रथम श्रेणी में -

1) को लागू प्रोटोकॉल:

@protocol TextControllerDelegate <NSObject> 

@optional // Delegate protocols 
- (void)textFieldDidEndEditing:(UITextField *)textField; 

@end 

2) @property (nonatomic, unsafe_unretained, readwrite) id <TextControllerDelegate> delegate;

3) विधि में - (void)textFieldDidEndEditing:(UITextField *)textField वर्ग के अंदर , [delegate textFieldDidEndEditing:textField]

द्वितीय श्रेणी में:

1) प्रथम श्रेणी के ऑब्जेक्ट को लागू करें, स्वयं को प्रतिनिधि (दूसरे वर्ग में) सेट करें।

2) को लागू विधि - (void)textFieldDidEndEditing:(UITextField *)textField

2

एक तकनीक मल्टीकास्टिंग समर्थन करने के लिए अपने delegating वर्ग निम्न विधियों दे रहा है:

@interface Delegator : NSObject - (void)addDelegate:(id<MyProtocol>)delegate; - (void)removeDelegate:(id<MyProtocol>)delegate; @end

और एक NSHashTable में प्रतिनिधियों के लिए संदर्भ की दुकान। http://arielelkin.github.io/articles/objective-c-multicast-delegate/

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^