2009-10-29 3 views
146

आईफोन के लिए उद्देश्य-सी कोडिंग में आईबीएक्शन और आईबीऑलेट का उपयोग करने का उद्देश्य क्या है, अगर मैं उनका उपयोग नहीं करता तो इससे कोई फर्क पड़ता है?आईबीओटलेट और आईबीएक्शन

+12

सभी उत्तरों विचार के एक ही प्रकार का उल्लेख .. लेकिन कोई बताता है कि क्यों इंटरफ़ेस बिल्डर सिर्फ एक ही काम करने के लिए यदि आप अपने स्रोत में IBAction/IBOutlet शामिल नहीं है लगता है। क्या आईबीएक्शन और आईबीओलेट के लिए कोई और कारण है या यह उन्हें छोड़ने के लिए __ok है? – bobobobo

+2

नीचे माइकल रोजर्स का उत्तर थोड़ा सा स्पष्टीकरण जोड़ता है कि कोड IBAction छोड़ने पर भी क्यों काम करता है। – Krishna

+0

IBActions लक्ष्य कार्रवाई बातचीत तंत्र के हिस्से के रूप में मौजूद हैं, आप कैसे IBAction कि में यहाँ फिट बैठता है के बारे में पढ़ सकते हैं: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Target-Action/ लक्ष्य-Action.html # // apple_ref/doc/यूआईडी/TP40010810-CH12 आप यहाँ दुकानों पर पढ़ सकते हैं: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Outlets /Outlets.html#//apple_ref/doc/uid/TP40010810-CH10-SW1 –

उत्तर

194

IBAction और IBOutlet इंटरफ़ेस बिल्डर में संदर्भित चर और विधियों को इंगित करने के लिए परिभाषित मैक्रोज़ हैं।

IBActionvoid को हल करता है और कुछ भी नहीं IBOutlet पर ले कर जाता है, लेकिन वे Xcode और इंटरफ़ेस बिल्डर है कि इन चर और तरीकों द्वारा अपने कोड में UI तत्व से जोड़ने के लिए इंटरफ़ेस बिल्डर में इस्तेमाल किया जा सकता करने के लिए दर्शाता है।

आप बिल्कुल इंटरफ़ेस बिल्डर का उपयोग किया जा करने के लिए नहीं जा रहे हैं, तो आप उन्हें अपने कोड में की जरूरत नहीं है, लेकिन आप इसे उपयोग करने के लिए जा रहे हैं, तो आप तरीकों कि इस्तेमाल किया जाएगा के लिए IBAction निर्दिष्ट करने की आवश्यकता आईबी में और IBOutlet वस्तुओं के लिए जो आईबी में उपयोग किया जाएगा।

+0

@Jasarien "आपको उन विधियों के लिए आईबीएक्शन निर्दिष्ट करने की आवश्यकता है जिनका उपयोग आईबी और आईबीओलेट में उन वस्तुओं के लिए किया जाएगा जिनका उपयोग आईबी में किया जाएगा।" क्या अंतर है? – cyrilchampier

+3

@nerith वही अंतर जो विधियों और वस्तुओं के बीच मौजूद है। तरीकों के लिए IBActions, वस्तुओं के लिए IBOutlet। – Jasarien

+0

बस स्पष्ट करने के लिए, क्योंकि मेरी पोस्ट संपादित की गई थी, 'IBOutlet' 'id' को हल नहीं करता है। इस पर विचार करें: 'आईबीओलेट यूलाबेल * नाम लेबल;' - यदि 'आईबीओलेटलेट 'आईडी' के लिए हल किया गया है, तो वह कोड 'आईडी UIlabel * namelabel' पढ़ेगा, जो एक कंपाइलर त्रुटि उत्पन्न करता है। जैसा कि मैंने मूल रूप से कहा था, 'आईबीओलेटलेट' कुछ भी हल नहीं करता है। https://developer.apple.com/library/ios/recipes/xcode_help-interface_builder/_index.html – Jasarien

30

यदि आप अपने जीयूआई घटकों के लिए इंटरफेस बिल्डर (इसलिए आईबी उपसर्ग) का उपयोग कर रहे हैं तो आपको आईबीओटलेट और आईबीएक्शन का उपयोग करने की आवश्यकता है। आईबी में घटकों के साथ आपके आवेदन में गुणों को जोड़ने के लिए आईबीओलेट की आवश्यकता है, और आईबीएक्शन का उपयोग आईबी में कार्यों के साथ आपकी विधियों को जोड़ने की अनुमति देने के लिए किया जाता है।

उदाहरण के लिए, मान लीजिए कि आप आईबी में एक बटन और लेबल परिभाषित करते हैं।

UILabel IBOutlet *myLabel; 
-(IBAction) pushme; 

तब आईबी में आप mylabel लेबल के साथ जुड़ने और साथ pushme विधि से जोड़ेगी: गतिशील रूप से बटन को दबाकर लेबल का मूल्य बदलने के लिए, आप के लिए एक कार्रवाई और अपने एप्लिकेशन में संपत्ति समान परिभाषित करेगा बटन। आईबी में इन कनेक्शनों के लिए आपको IBAction और IBOutlet की आवश्यकता है।

+13

लेकिन यदि आप आईबीओलेट लेबलिंग शामिल नहीं करते हैं तो यह __still क्यों काम करता है ..? – bobobobo

+7

क्योंकि ये मैक्रोज़ संकलन समय पर कुछ भी नहीं करते हैं, इसलिए वे बस इंटरफ़ेस बिल्ड ऐप स्रोत विधियों में उन विधियों और इंटरफ़ेस बिल्डर फ़ाइलों को पा सकते हैं ताकि आप इंटरफ़ेस बिल्डर और आपके कोड के बीच खींच सकें, एक कनेक्शन इसे ' कोई और बात नहीं है। –

+0

आईबीएक्शन कम से कम पिछले दशक के लिए, संपादन समय पर कुछ भी नहीं करता है। आप इंटरफेस बिल्डर में भी '(शून्य)' विधि को जोड़ सकते हैं। –

3

IBAction और IBOutlets का उपयोग आपके नियंत्रक के साथ इंटरफ़ेस बिल्डर में किए गए आपके इंटरफ़ेस को हुक करने के लिए किया जाता है। यदि आप इंटरफ़ेस बिल्डर का उपयोग नहीं करेंगे और कोड में पूरी तरह से अपना इंटरफ़ेस बनायेंगे, तो आप उनका उपयोग किए बिना प्रोग्राम बना सकते हैं। लेकिन वास्तव में हम में से अधिकांश इंटरफ़ेस बिल्डर का उपयोग करते हैं, एक बार जब आप अपने इंटरफ़ेस में कुछ इंटरएक्टिविटी प्राप्त करना चाहते हैं, तो आपको आईबीएक्शन और आईबॉउटलेट्स का उपयोग करना होगा।

5

इंटरफ़ेस बिल्डर यह निर्धारित करने के लिए उनका उपयोग करता है कि आपके विंडो/दृश्य में उपयोग किए जा रहे इंटरफ़ेस नियंत्रणों के लिए सदस्यों और संदेशों को 'वायर्ड' किया जा सकता है।

आईबीओटलेट और आईबीएक्शन पूरी तरह से मार्कर के रूप में हैं कि इंटरफ़ेस बिल्डर डिज़ाइन समय पर आपके कोड को पार करते समय देखता है, उनके पास कंपाइलर द्वारा उत्पन्न कोड पर कोई प्रभाव नहीं पड़ता है।

38

एक विधि को ध्वजांकित करने का पारंपरिक तरीका ताकि यह इंटरफ़ेस बिल्डर में दिखाई दे, और आप इसके साथ एक कनेक्शन खींच सकते हैं, विधि वापसी प्रकार IBAction बनाने के लिए किया गया है। हालांकि, यदि आप अपना तरीका शून्य बनाते हैं, इसके बजाय (IBAction # शून्य होने के लिए परिभाषित किया गया है), और एक (आईडी) तर्क प्रदान करें, विधि अभी भी दिखाई दे रही है। इस अतिरिक्त लचीलापन, अल

इन सभी 3 इंटरफ़ेस बिल्डर से दिखाई दे रहे हैं प्रदान करता है:

-(void) someMethod1:(id) sender; 
-(IBAction) someMethod2; 
-(IBAction) someMethod3:(id) sender; 

विवरण के लिए एप्पल के इंटरफ़ेस बिल्डर उपयोगकर्ता गाइड, विशेष रूप से अनुभाग हकदार Xcode एकीकरण।

+1

यहाँ ऊपर मार्गदर्शिका का लिंक का सुझाव दिया है। आपको यह विचार कहाँ से मिला? – Aggressor

3

एक आउटलेट कोड से यूआई का एक लिंक है। यदि आप यूआई तत्व को दिखाना या छिपाना चाहते हैं, तो यदि आप किसी टेक्स्टफील्ड का टेक्स्ट प्राप्त करना चाहते हैं या किसी तत्व को सक्षम या अक्षम कर सकते हैं (या सौ अन्य चीजें) तो आपको स्रोतों में उस ऑब्जेक्ट का आउटलेट परिभाषित करना होगा और उस आउटलेट को लिंक करना होगा UI तत्व में "इंटरफ़ेस ऑब्जेक्ट" के माध्यम से। इसके बाद आप अपने कोडिंग में किसी भी अन्य चर की तरह आउटलेट का उपयोग कर सकते हैं।

IBAction - एक विशेष विधि उपयोगकर्ता इंटरफ़ेस वस्तुओं से शुरू हो गया। इंटरफ़ेस बिल्डर उन्हें पहचानता है।

@interface Controller 
{ 
    IBOutlet id textField; // links to TextField UI object 
} 

- (IBAction)doAction:(id)sender; // e.g. called when button pushed 

अधिक जानकारी के लिए देखें Apple Docs

+0

Uhm, नहीं, कि नहीं क्या एक IBOutlet है: –

+0

मैंने अपना उत्तर –

1

जब आप इंटरफ़ेस बिल्डर का उपयोग, आप कनेक्शन इंस्पेक्टर का उपयोग ईवेंट हैंडलर्स के साथ घटनाओं की स्थापना के लिए कर सकते हैं, ईवेंट हैंडलर्स की अपेक्षा की जाती कार्यों IBAction है कि होने के लिए संशोधक। एक दृश्य को उसी प्रकार के संदर्भ और आईबीओटलेट संशोधक के साथ जोड़ा जा सकता है।

2

आरेख में Ran जबकि मुख्य मान कोडिंग को देख, सोचा था कि यह किसी की मदद कर सकते हैं। यह आईबीओलेट के बारे में समझने में मदद करता है।

प्रवाह को देख कर, एक है कि IBOutlets केवल वहाँ नोक फ़ाइल में एक नियंत्रण नाम के साथ संपत्ति के नाम से मेल करने के लिए कर रहे हैं देख सकते हैं।

How nib file is loaded, screenshot of Matt's online book for iOS6

+0

संपादित किया है यह उत्तर _why_ और _how_ IBOutlets काम करता है, न केवल वे क्या करते हैं _। –

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