2013-02-08 44 views
8

मेरे पास दो खिड़कियां हैं: विंडो ए को एनआईबी से लोड किया गया है; और विंडो बी प्रोग्रामेटिक रूप से बनाया गया है।बांधें: toObject: केपीपाथ के साथ: विकल्प: एक तरफा बाध्यकारी है?

दोनों खिड़कियों एक NStextView है: विंडो ए में TextView की attributedString एक मॉडल आईबी का उपयोग कर की संपत्ति text के लिए बाध्य है; जबकि विंडो बी में टेक्स्टव्यू का जिम्मेदार स्ट्रिंग -[NSObject bind:toObject:withKeyPath:options:] विधि का उपयोग कर मॉडल की संपत्ति text संपत्ति से जुड़ा हुआ है।

[textview bind:@"attributedString" toObject:obj withKeyPath:@"text" options:nil]; 

यहाँ अजीब बात है: विंडो बी में TextView वास्तव में obj.text के लिए बाध्य है, लेकिन TextView में परिवर्तन obj.text के लिए अद्यतन कभी नहीं किया गया है। लेकिन, अगर मैंने विंडो ए के टेक्स्टव्यू में बदलाव किया है, तो obj.text और विंडो बी में टेक्स्टव्यू तदनुसार अपडेट किया गया है।

तो मैं सोच रहा हूं, -[NSObject bind:toObject:withKeyPath:options:] विधि केवल एक तरफा बाध्यकारी के लिए है। मुझे कोको दस्तावेज में स्पष्ट स्पष्टीकरण नहीं मिला। क्या किसी को इस समस्या का अनुभव है? कोड में दो-तरफा बाध्यकारी कैसे लागू करते हैं?

उत्तर

3

कोको बाइंडिंग स्वाभाविक रूप से दो-तरफा हैं, लेकिन कुछ व्यवहार (जैसे टेक्स्ट फ़ील्ड के निरंतर/लाइव अपडेटिंग) को विशिष्ट विकल्पों को सेट करने की आवश्यकता होती है। आईबी में आप यह सुनिश्चित करना चाहते हैं कि "निरंतर अद्यतन मूल्य" चेक बॉक्स चेक किया गया हो। प्रोग्रामेटिक रूप से समकक्ष व्यवहार प्राप्त करने के लिए, आपको बाध्यकारी पर options निर्दिष्ट करना होगा। यही कारण है कि कुछ इस तरह दिख सकता है:

[textview bind: NSAttributedStringBinding 
     toObject: obj 
    withKeyPath: @"text" 
     options: (@{ 
       NSContinuouslyUpdatesValueBindingOption : @YES })]; 

यह उल्लेख है कि जब की स्थापना एक प्रोग्राम के रूप में बाध्यकारी, यह एक बराबर आईबी में बाध्यकारी जाँच और सुनिश्चित करें कि आप कार्यक्रम संबंधी बाध्यकारी करने के लिए सभी एक ही सेटिंग्स गुजर रहे हैं बनाने के लायक है लायक है। उदाहरण के लिए, मैं आईबी में देखता हूं कि "एकाधिक मान चयन संपादन की अनुमति दें", "सशर्त रूप से संपादन योग्य सेट करता है", और "लागू नहीं कुंजी के लिए उठाता है" विकल्प सभी को डिफ़ॉल्ट रूप से एनएसटीक्स्टव्यू के जिम्मेदार स्ट्रिंग बाध्यकारी के लिए चेक किया जाता है। यही कारण है कि मतलब होगा हमारे कार्यक्रम संबंधी बाध्यकारी चाहिए शायद वास्तव में देखो की तरह:

[textview bind: NSAttributedStringBinding 
     toObject: obj 
    withKeyPath: @"text" 
     options: (@{ 
       NSContinuouslyUpdatesValueBindingOption : @YES, 
       NSAllowsEditingMultipleValuesSelectionBindingOption : @YES, 
       NSConditionallySetsEditableBindingOption : @YES, 
       NSRaisesForNotApplicableKeysBindingOption : @YES })]; 
+0

यह अभी भी मेरे लिए काम नहीं कर रहा था: यहां उपयोगकर्ता चूक के साथ उदाहरण है। मुझे जवाब मिला (मेरे मामले के लिए) -> http://stackoverflow.com/questions/1169097/can-you-manually-implement-cocoa- बाइंडिंग –

+0

मुझे उपरोक्त लिंक किए गए प्रश्न की प्रासंगिकता के बारे में निश्चित नहीं है । यहां उल्लिखित बाध्यकारी दो एनएससींट्रोल वस्तुओं के बीच है - कोई कस्टम बाध्यकारी कार्यान्वयन आवश्यक नहीं है। – stevesliva

2

हाँ, बाँध: toObject: withKeyPath: विकल्प: एक ही रास्ता है और कोई विकल्प यह प्रभावित कर सकते हैं। यह वही नहीं है जैसा आप .nib फ़ाइल में बाध्यकारी बनाते हैं। हमेशा के रूप में ऐप्पल अपने दस्तावेज़ों में ऐसी सरल बात का जिक्र करना भूल गया। यहां सबसे सरल समाधान एक ही समय में रिवर्स बाध्यकारी बनाना है जब आप एक बनाते हैं। जब आप मान निर्दिष्ट करते हैं तो यह आपके कोड को लूप नहीं करेगा।

// two way binding of MyObject.myValue to user defaults 
[NSUserDefaultsController.sharedUserDefaultsController.values bind: @"myValueInDefaults" 
                  toObject: myObject 
                 withKeyPath: @"myValue" 
                  options: @{@"NSContinuouslyUpdatesValue":@YES}]; 

[myObject bind: @"myValue" 
     toObject: NSUserDefaultsController.sharedUserDefaultsController 
    withKeyPath: @"values.myValueInDefaults" 
     options: @{@"NSContinuouslyUpdatesValue":@YES}]; 
+0

क्या मुझे दो NSValueTransformers का उपयोग करने की आवश्यकता है, यदि मुझे एक मान को दूसरे में परिवर्तित करने की आवश्यकता है और इसके विपरीत, कुंजी NSValueTransformerBindingOption के लिए, या कोई पर्याप्त होगा? – rraallvv

+0

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

+0

मैं उदाहरण के लिए डिग्री से रेडियंस तक और इसके विपरीत, मुझे लगता है कि उनमें से दो की आवश्यकता होगी, धन्यवाद – rraallvv