2013-02-25 53 views
10

के साथ एक आदेशित रिश्ते को बाध्यकारी किसी एक आदेश के लिए आदेशों में एनएसएआरएआर कंट्रोलर की सामग्री को कैसे बाध्य करता है?एक NSArrayController

मेरे कोर डेटा मॉडल में एक अनोखा रिश्ते है, और एक एनएसएआरएआर नियंत्रक जिसका सामग्री सेट मूल इकाई से उस संबंध से जुड़ा हुआ है। यह ठीक काम करता है, डेटा NSArrayController से सुलभ है, कोई समस्या नहीं है।

मैंने विकास के दौरान निर्णय लिया कि उपयोगकर्ताओं को इन बच्चों की वस्तुओं को मैन्युअल रूप से पुन: व्यवस्थित करने की अनुमति देना बेहतर होगा, इसलिए मैंने रिश्ते को एक आदेशित व्यक्ति में बदल दिया। अब, जब मेरी NSArrayController मेरी निब से बनाया जा रहा है, तो निम्न त्रुटि प्रस्तुत किया है:

Cannot create NSSet from object Relationship '...' fault on managed object ... of class _NSFaultingMutableOrderedSet 

अब वास्तव में, मुझे लगता है कि यह सब समझ में आता है: यह एक आदेश दिया संबंध है, तो अब मैं एक आदेश दिया सेट हो रही है। सामग्री ऐरे को बाध्यकारी भी अनुचित होगा, क्योंकि अब यह एक NSOrderedSet है, एक सरणी नहीं है। मेरा सवाल है: अब मैं इस रिश्ते के डेटा को एनएसएआरएआर कंट्रोलर में कैसे बांधूं?

+0

मैं भी इस समस्या से आया और मुझे बहुत आश्वस्त है कि यह 'एनएसएआरएआर कंट्रोलर' के साथ एक बग है - एक बग रिपोर्ट दायर की। – Vervious

+0

ऐसा लगता है कि हैल के उत्तर में उद्धृत कार्यवाही के आधार पर, वास्तव में किसी को भी इसे बांधने का "सही" तरीका नहीं है। मैं एक बग रिपोर्ट भी कर दूंगा, क्योंकि आईएमओ इसे एक शोस्टॉपर, वर्कअराउंड या नहीं होना चाहिए। – Khakionion

उत्तर

8

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

टॉम फेवेस्टर के पास detailed blog post है जो इस कमी के आसपास काम करने के लिए NSValueTransformer के उपयोग का वर्णन करता है, जो फ्लाई पर NSOrderedSet और NSArray के बीच परिवर्तित होता है। वह sample implementation on Github भी प्रदान करता है।

+0

धन्यवाद! जैसा कि मैंने प्रश्न के अंतिम अनुच्छेद में बताया है, मुझे पता है कि एनएसएससेट (बल्कि, इसकी कमी) की विरासत बाइंडिंग के साथ समस्या है क्योंकि वर्तमान में चीजें खड़ी हैं। लेकिन यह मूल्य ट्रांसफार्मर दृष्टिकोण एक जीवन बचतकर्ता है! मैं इसे देखने के लिए सुनिश्चित हो जाएगा। – Khakionion

+3

वर्कअराउंड (मुझे लगता है) के साथ समस्या यह है कि उत्परिवर्तनीय एक्सेसर्स का उपयोग नहीं किया जाएगा, जिसका अर्थ है कि किसी भी परिवर्तन का मतलब पूरे सेट को पुन: असाइन/पुनर्निर्मित करना है। – Vervious

9

मैं इस चर्चा में आया कि यह देखने के लिए कि इस मोर्चे पर कोई नया विकास हुआ है या नहीं। एक शिपिंग ऐप में मैं वर्तमान में सरणी नियंत्रक की सामग्री सरणी को [email protected] पर बांधता हूं और यह ठीक काम करता है, यह सुनिश्चित नहीं करता कि मैंने खुद को खोज लिया है या किसी और ने इसे कहीं और सुझाव दिया है।

+0

यह स्पष्ट रूप से समाधान है। – Altimac

+2

मुझे यकीन नहीं है कि यह समाधान है, क्योंकि "सरणी" ऑपरेटर NSOrderSet की "सरणी" विधि पर कॉल करता है, जो एक "मुखौटा" सरणी वस्तु देता है, जो डिज़ाइन द्वारा अपरिवर्तनीय है - (NSOrderSet.h में इसके हेडर-फ़ाइल दस्तावेज़ देखें)। इसका मतलब है, NSArrayController "बाध्य" कर सकता है लेकिन NSOrderedSet में कोई भी परिवर्तन करने में विफल रहेगा। यह आधे रास्ते से बाध्यकारी नहीं है। केवल पढ़ने के लिए समाधान। वास्तव में –

+0

काफी सच है। यदि आपको उत्परिवर्तन की आवश्यकता है, तो यह असफल हो जाएगा। अच्छी पकड़;) – Altimac