मेरे पास अपने स्वयं के NSView सबक्लास के लिए बाइंडिंग लागू करने में एक दरार है। यह काम करता है, लेकिन एक निब फ़ाइल से फाइल के मालिक को बाध्य करते समय चक्र बनाए रखने में समस्याएं होती हैं। इसे पढ़ने के बाद, मुझे पता चला कि ऐप्पल को कुछ साल पहले एक ही समस्या थी, लेकिन इसे कुछ जादू अनियंत्रित वर्ग (एनएसएयूयूओटीबींडर) के साथ तय कर दिया है।क्या आप कोको बाइंडिंग मैन्युअल रूप से कार्यान्वित कर सकते हैं?
http://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600 पर बनाए रखने की चक्र समस्या की लंबी चर्चा है। खिड़की नियंत्रक जारी किए जाने से पहले सभी बाइंडिंग को अनइंड करना है से पहले, विंडोवॉलक्लोस: जैसे स्थान पर। यह मेरे लिए एक अनावश्यक हैक की तरह लगता है।
मेरा प्रश्न यह है: क्या अनियंत्रित सुविधाओं का उपयोग किए बिना कस्टम बाइंडिंग के साथ-साथ ऐप्पल द्वारा बनाए गए कस्टम बाइंडिंग करने का कोई तरीका है? क्या मैं इस बारे में गलत तरीके से जा रहा हूं?
अद्यतन 2: मुझे एक समाधान मिला है जो मैन्युअल रूप से लागू बाइंडिंग को ऐप्पल की बाइंडिंग की तरह काम करने की अनुमति देता है। यह वास्तव में अनियंत्रित सुविधाओं का उपयोग किए बिना, अनियंत्रित NSAutounbinder क्लास का लाभ उठाता है। मैं बाद में समाधान पोस्ट करूंगा।
अद्यतन: मैं exposeBinding:
का उपयोग कर की कोशिश की है, और यह कोई फर्क बनाने के लिए प्रतीत नहीं होता। हालांकि, NSObject
bind:toObject:withKeyPath:options:
आधे कार्यों के कार्यान्वयन। यह बिंदी से बाइंडर में परिवर्तन (यानी मॉडल/नियंत्रक से देखने के लिए) का प्रचार करता है, लेकिन विपरीत तरीके से काम नहीं करता है। इसके अलावा, हालांकि स्पष्ट रूप से देखा जा रहा है, observeValueForKeyPath:ofObject:change:context:
कभी ट्रिगर नहीं किया जाता है।
उदाहरण यहाँ परियोजना: http://www.tomdalling.com/wp-content/BindingsTest.zip
एप्पल के प्रलेखन इंगित करता है आप करते हैं, वास्तव में, मैनुअल बाइंडिंग को लागू करने के bind:toObject:withKeyPath:options:
ओवरराइड करने के लिए है। यहाँ देखें: http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html
साइड नोट: मैं जाँच की है कि गैर-दस्तावेजी NSAutounbinder काम करता है, और यहाँ मैं क्या पता है।
जब एक एनएसविंडो कंट्रोलर को बाध्यकारी बनाया जाता है, तो बाध्य वस्तु वास्तव में एनएसयूंडोनाइंडर है जिसे एनएसविंडो कंट्रोलर से प्राप्त किया जाता है - [NSWindowController _autounbinder]। NSWindowController ऑब्जेक्ट के लिए NSAutounbinder एक गैर-बनाए रखने वाली प्रॉक्सी है। यह बरकरार चक्र की समस्या से बचने के लिए गैर-बनाए रखना है।
कब - [NSWindowController रिलीज] को कॉल किया जाता है और retountCount == 1, NSAutounbinder स्वयं को सभी बाइंडिंग को अनबिंड करता है। इससे यह सुनिश्चित होता है कि ऑब्जेक्ट को हटाए जाने से पहले कोई खतरनाक पॉइंटर्स नहीं हैं।
कोकोबिल्डर नीचे है, तो आप प्रासंगिक थ्रेड http://lists.apple.com/archives/cocoa-dev/2004//Jun/msg00835.html – s4y