2011-12-27 26 views
11

हालांकि मैंने कोको बाइंडिंग के बारे में कई जानकारी खोजी है, फिर भी मैं अपने पास मौजूद जानकारी से अपेक्षाकृत असंतुष्ट हूं। ऐसा लगता है कि विषय कई लोगों के लिए कुछ परेशान है और बहुत से लोग इस पैटर्न से परहेज कर रहे हैं, जो मुझे विश्वास नहीं है। क्यों NSObjectController अगर मैं बाइंडिंग स्थापित कर सकते हैं की जरूरत है:NSObjectController का उपयोग क्यों करें

बेशक

, यह लग सकता है कि बाइंडिंग कभी कभी भी जटिल या शायद बहुत ज्यादा भूमि के ऊपर के साथ बनाया गया है ...

हालांकि, मैं एक बहुत ही सीधा और विशिष्ट प्रश्न है सीधे?

उदाहरण के लिए, कोड:

[controller bind:@"contentObject" toObject:self withKeyPath:@"numberOfPieSlices" options:nil]; 

[slicesTextField bind:@"value" toObject:controller withKeyPath:@"content" options:nil]; 
[stepperControl bind:@"value" toObject:controller withKeyPath:@"content" options:nil]; 

बिल्कुल के रूप में एक ही है:

[slicesTextField bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil]; 
    [stepperControl bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil]; 

मेरे मामले यहाँ में, हम वर्ग जो अंदर सब कुछ हो रहा है की संपत्ति के बारे में बात कर रहे हैं, इसलिए मैं NSObjectController की आवश्यकता का आकलन कर रहा हूं जब:

  • नियंत्रक के लिए मुख्य पथ वस्तु है और अन्य नियंत्रण के बंधन, उसके गुण की जरूरत है अपने मूल्य के लिए नहीं पुरातन और उनके आसपास रैपर के साथ जैसा भी मामला है (मेरे मामले में numberOfPiesSlices NSInteger है)

  • या जब बंधन अन्य बाहर वस्तुओं से की जरूरत है, न केवल वस्तुओं के बीच एक

क्या कोई इसे पुष्टि या अस्वीकार कर सकता है?

उत्तर

8

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

बाइंडिंग केवल प्रस्ताव पर कार्यक्षमता का हिस्सा दर्शाते हैं। * ऑब्जेक्ट कंट्रोलर कक्षाएं स्वचालित रूप से अन्य कई दोहराव वाले नियंत्रक (जैसे मॉडल, व्यू, कंट्रोलर) कोड का भी ख्याल रख सकती हैं, जिसे आमतौर पर एक एप्लिकेशन की आवश्यकता होती है। उदाहरण के लिए वे कर सकते हैं:

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

आप इस में से कोई भी कर रहे हैं, तो यह शायद नहीं NSObjectController का उपयोग कर के लायक है। इसके उप-वर्ग (एनएसएआरएआर कंट्रोलर आदि) अधिक उपयोगी हैं।

अपने सटीक प्रश्न की चर्चा के लिए here भी देखें!

+1

यूआई तत्वों की बाइंडिंग किसी ऑब्जेक्ट नियंत्रक या किसी अन्य चीज़ से बाध्य हो सकती है, जैसा कि यह सवाल में कहा गया है। तो ऑब्जेक्ट नियंत्रक किस कोड को खत्म करता है? –

+0

वह कोड जहां आपने पहली जगह बाध्यकारी सेट की है - आप इसे एनबीओब्जेक्ट कंट्रोलर के साथ आईबी में कर सकते हैं। जब तक मैं गलत नहीं हूं और आप गैर-* नियंत्रक वस्तुओं के साथ आईबी में बाइंडिंग सेट कर सकते हैं? यदि ऐसा है तो ठीक करने के लिए खुश। – jrturton

+1

आप आईबी या निब संपादक में एक सादे ऑब्जेक्ट पर बाध्यकारी सेट नहीं कर सकते हैं, लेकिन आप * सादे ऑब्जेक्ट को बाध्य कर सकते हैं। किसी ऑब्जेक्ट कंट्रोलर को इसके अलावा बाध्य करने के अलावा क्या उद्देश्य है- और यदि कोई नहीं है, तो उस ऑब्जेक्ट पर सीधे नियंत्रण क्यों न करें जिसे इसे समर्थन देने की आवश्यकता है? –

4

अगर मैं सीधे बाइंडिंग स्थापित कर सकता हूं तो NSObjectController की आवश्यकता क्यों है?

वहाँ अगर लाभ हैं:

मैं इस सवाल को पढ़ने के कुछ दिन पहले, जबकि आज NSObjectController बारे में कुछ जानकारी है, और की तलाश में हैं, जबकि मेरे खोज जारी है, मैं the following passage जो प्रश्न के लिए प्रासंगिक लग रहा था पाया वस्तु एनएसडीडिटर पंजीकरण लागू करने के लिए बाध्य है। यह एक कारण है कि को सीधे मॉडल पर बाध्य करने के बजाय नियंत्रक ऑब्जेक्ट्स को बांधना अच्छा विचार है। NSEditorRegistration बाध्यकारी को नियंत्रक को बताता है कि इसकी सामग्री संपादित होने की प्रक्रिया में है। नियंत्रक ट्रैक रखता है जिसमें से वर्तमान में नियंत्रक की सामग्री संपादित कर रहे हैं। यदि उपयोगकर्ता विंडो को बंद करता है, उदाहरण के लिए, से जुड़ा प्रत्येक नियंत्रक यह विंडो उन सभी दृश्यों को तुरंत लंबित संपादन करने के लिए बता सकता है, और इस प्रकार उपयोगकर्ता कोई डेटा खो नहीं पाएगा। ऐप्पल कुछ जेनेरिक नियंत्रक ऑब्जेक्ट्स (NSObjectController, NSArrayController, NSTreeController) की आपूर्ति करता है जिसका उपयोग आपके मॉडल ऑब्जेक्ट्स को लपेटने के लिए किया जा सकता है, जो संपादक पंजीकरण कार्यक्षमता प्रदान करता है।

का उपयोग करते हुए एक नियंत्रक भी लाभ यह है कि बाइंडिंग प्रणाली सीधे अपने मॉडल वस्तु नहीं अवलोकन है - इसलिए यदि आप इस तरह के एक विस्तार ध्यान में रखते हुए के रूप में (एक नया एक के साथ अपने मॉडल वस्तु की जगह उपयोगकर्ता है जहां निरीक्षण किए जा रहे रिकॉर्ड को बदल दिया है), आप नियंत्रक, केवीओ नोटिस और बाध्यकारी अद्यतनों के अंदर मॉडल ऑब्जेक्ट को प्रतिस्थापित कर सकते हैं।