2009-04-20 20 views
21

क्या उद्देश्य-सी में प्रतिनिधियों जैसे गुमनाम कार्यान्वयन की घोषणा करना संभव है। मुझे लगता है कि मैं शब्दावली का अधिकार है, लेकिन यहाँ एक जावा उदाहरण है:बेनामी प्रतिनिधि कार्यान्वयन?

myClass.addListener(new FancyInterfaceListener({ 
    void onListenerInterestingAction(Action a){ 
     ....interesting stuff here 
    } 
}); 

इसलिए उदाहरण के एक UIActionSheet कॉल मैं एक ही कक्षा में एक और तरीका है, जो थोड़ा पागल लगता है कि अगर मैं पास करना चाहते हैं की घोषणा करने के लिए है संभाल करने के लिए यह डेटा, क्योंकि मुझे उस डेटा को वैश्विक चर के रूप में स्टोर करना होगा। यहाँ अगर आप पूछ एक पुष्टिकरण संवाद के साथ कुछ को हटाने का एक उदाहरण है अपने यकीन है कि:

-(void)deleteItem:(int)indexToDelete{ 
    UIActionSheet *confirm = [[UIActionSheet alloc] initWithTitle:@"Delete Item?" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:nil]; 
    [confirm showInView:self.view]; 
    [confirm release]; 
} 

और एक ही कक्षा में UIActionSheetDelegate:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    if (buttonIndex == 0){ 
     [[Settings sharedSettings] removeItemAtIndex:/*need index variable here*/]; 
     [drinksTable reloadData]; 
    } 
} 

यह इनलाइन घोषित मैं क्या करने में सक्षम होना चाहता हूँ , जैसे मैंने शीर्ष पर जावा उदाहरण में किया था। क्या यह संभव है?

+0

मैं इस तरह की स्थितियों के लिए एक सकारात्मक समाधान लिखता हूं [यहां] (https://github.com/GojaN/AnonymusDelegate)। ध्यान रखें कि यह अवधारणा का सबूत है। –

+0

हाँ, आप इसे तृतीय-पक्ष पुस्तकालयों के साथ कर सकते हैं, मेरा पूरा उत्तर यहां पढ़ें: http://stackoverflow.com/a/33096839/440168 – k06a

उत्तर

17

वर्तमान में उद्देश्य-सी में ऐसा करने का कोई तरीका नहीं है। ऐप्पल ने भाषा में ब्लॉक जोड़ने के लिए अपने प्रयासों पर कुछ काम प्रकाशित किया है (वास्तव में अज्ञात कक्षाओं से लैम्ब्डा बंद होने की तरह)। आप शायद उन लोगों के साथ अज्ञात प्रतिनिधि के समान कुछ करने में सक्षम होंगे।

इसी समय, अधिकांश कोको प्रोग्रामर प्रतिनिधि वर्ग पर अलग-अलग श्रेणी में प्रतिनिधि विधियों को जोड़ते हैं। यह कोड को और व्यवस्थित रखने में मदद करता है।

@interface MyClass (UIActionSheetDelegate) 
- (void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex; 
@end 

@implementation MyClass 
//... normal stuff here 
@end 

@implementation MyClass (UIActionSheetDelegate) 
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    if (buttonIndex == 0){ 
     [[Settings sharedSettings] removeItemAtIndex:/*need index variable here*/]; 
     [drinksTable reloadData]; 
    } 
} 
@end 

Xcode के संपादक विंडो मुख्य वर्ग 'से श्रेणी की घोषणा और कार्यान्वयन अलग कर देगा में विधि पॉपअप: अपने उदाहरण में वर्ग के लिए मीटर फ़ाइल में, मैं कुछ इस तरह करना होगा।

+0

क्या आपके द्वारा लागू प्रत्येक प्रोटोकॉल के लिए आपको इंटरफ़ेस घोषणा की आवश्यकता है? यदि हां, तो यह बहुत अधिक काम है।(मैंने अपने इंटरफ़ेस में एक कार्यान्वित प्रोटोकॉल में विधियों को कभी भी घोषित नहीं किया है, इस आधार पर कि प्रोटोकॉल "लागू" प्रोटोकॉल की घोषणा करना काफी अच्छा था।) –

+1

नहीं, आप एकाधिक प्रोटोकॉल घोषित कर सकते हैं, बस इंटरफ़ेस में अल्पविराम का उपयोग करें। इसके अलावा, इस तरह की एक श्रेणी का उपयोग करने के बजाय मैंने देखा है कि यह कोड (वास्तव में यह नहीं है कि यह सुविधा किस प्रकार डिज़ाइन की गई है - यह आपको कक्षाओं को विस्तारित करने की अनुमति देने के लिए डिज़ाइन की गई है, जिनके पास उप-वर्गीकरण के बिना कार्यान्वयन नहीं है), बस कोड को #pragma mark' निर्देश के साथ फ़ाइल में अपने स्वयं के अनुभाग में विभाजित करता है। –

4

उद्देश्य-सी में जावा की तरह अज्ञात वर्गों की धारणा नहीं है, इसलिए आप जावा कोड में "इनलाइन" श्रेणी नहीं बना सकते हैं।

+0

पर्याप्त मेला, तो क्या कोई और तरीका बनाने से कहीं अधिक सुंदर तरीके से ऐसा करने का कोई तरीका है समान कक्षा में? अगर मैं दो अलग-अलग UIActionSheets चाहता था तो क्या होगा? – rustyshelf

+0

दो एक्शन शीट्स के लिए आप टैग प्रॉपर्टी का उपयोग यह देखने के लिए करेंगे कि किसने प्रतिनिधि विधि को बुलाया था। यदि आप इस तरह की कई परिस्थितियों में आते हैं, तो मुझे लगता है कि उस नियंत्रक की ज़िम्मेदारी बहुत बढ़िया हो सकती है। आपके पास जिस तरह से है उससे कहीं ज्यादा सुरुचिपूर्ण नहीं है। जहां तक ​​मुझे पता है, आपको खुद को आइटम इंडेक्स का ट्रैक रखना होगा। – Jab

1

मेरा मानना ​​है कि अज्ञात कक्षाएं उद्देश्य-सी में लागू की जा सकती हैं, लेकिन इसमें NSProxy जादू और IMP पागलपन लगेगा। यह मेरी वर्तमान परियोजनाओं में से एक है।

2

जब मैं इस पर आया तो मैं कुछ अलग दिख रहा था, लेकिन यदि आप UIALERTVIEW + ब्लॉक के लिए खोज करते हैं तो आपको इनलाइन UIALERTVIEWs करने के लिए कई हिट मिल जाएंगी। यह वह है जिसे मैं उपयोग कर रहा हूं: ALERTVIEW w/blocks

0

प्रतिनिधि इंटरफ़ेस को लागू करने वाली कक्षा के बारे में कैसे। प्रारंभ में यह एक ब्लॉक लेगा। प्रतिनिधि परिभाषा में यह इस ब्लॉक को बुलाता है।

यह पहचान पर तुलना किए बिना एकाधिक UIActionSheets को एक साथ मौजूद होने की अनुमति देता है।

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