2010-08-01 15 views
7

मैं सोच रहा हूँ कि कैसे एक के बाद एक Xcode 3 की तरह एक रूपरेखा दृश्य लागू करेगा प्रति के साथ निर्माण विन्यास के लिए उपयोग कर रहा है:कार्यान्वयन NSOutlineView/NSTableView विभिन्न कोशिकाओं (और डेटा प्रकार) पंक्ति

alt text http://img812.imageshack.us/img812/9467/xcodeoutlineview.png

जब बाइंडिंग और एनएसटीरी कंट्रोलर/एनएसएआरएआर कंट्रोलर के साथ एक NSOutlineView/NSTableView का उपयोग करके, दृश्य के कॉलम को निर्दिष्ट कारणों से अलग-अलग कक्षों के लिए निर्दिष्ट बाइंडिंग प्राप्त करते हैं। यदि कॉलम में प्रत्येक पंक्ति एक ही सेल का उपयोग करती है, तो यह केक का एक टुकड़ा है। हालांकि अगर प्रत्येक पंक्ति (संभावित रूप से) अपने सेल प्रकार (और संभावित रूप से इसके स्वयं के बाइंडिंग का संग्रह) का उपयोग करती है, तो चीजें फंकी हो जाती हैं।

स्क्रीनशॉट को देखते हुए कोई स्पष्ट रूप से देख सकता है कि टेक्स्टफील्ड सेल को "मूल्य" के लिए केवल एक बाध्यकारी की आवश्यकता है। पॉपअप बटन सेल कम से कम एक "सामग्री" के लिए की जरूरत है, वहीं "contentValues ​​" और पिछले नहीं बल्कि कम से कम एक के लिए "SelectedIndex/selectedObject/selectedValue" बाइंडिंग के लिए एक। और चेकबॉक्स सेल को "मान" और (शायद) "शीर्षक" के लिए बाध्यकारी की आवश्यकता है।

कोई इसे यथासंभव स्वच्छ (और छोटा) कोड के साथ कैसे पूरा करेगा?
(या एक पूछ सकते हैं के रूप में:कैसे एप्पल यह किया होता?)

...

यहाँ क्या मैं अपने आप को कोशिश की है अब तक:
मैं उपयुक्त (नकल की) कोशिकाएं उपलब्ध के माध्यम से [रूपरेखा देखें: डेटासेलफॉरटेबल कॉलम: आइटम:] और उन्हें व्यक्तिगत डेटा मॉडल ([आइटम प्रतिनिधित्व ऑब्जेक्ट] से) से बांधें। मुझे पता है कि आउटलाइन व्यू में डेटा की सटीक मात्रा (< 500 पंक्तियां) प्रदर्शित की जा रही हैं, इसलिए प्रति पंक्ति एक सेल होने से स्मृति समस्या बहुत अधिक नहीं होनी चाहिए, नहीं? मुझे डेटा को ठीक से प्रदर्शित करने के लिए बाइंडिंग (yay!) के माध्यम से मिला है, हालांकि मैं उनके किसी भी मूल्य को बदलने में असमर्थ हूं। O_o स्पष्ट रूप से मूल्य परिवर्तन डेटा मॉडल के माध्यम से कभी नहीं मिलता है। क्या यह सरल से अधिक है [चेकबॉक्ससेल बाइंड: @ "वैल्यू" टू ऑब्जेक्ट: पंक्ति मॉडल के साथ कीपैथ: @ "वैल्यू" विकल्प: शून्य]? (के रूप में इस पर्याप्तके लिए हो रही मूल्यों लगता है, लेकिन के लिए नहीं तदनुसार स्थापित करने उन्हें।)

मैं इस विषय पर कोई जानकारी प्राप्त नहीं कर सकता है। प्रति कॉलम कस्टम सेल का उपयोग करने के लिए बहुत सारी जानकारी और संकेत, लेकिन "प्रति पंक्ति" आधार पर उनका उपयोग करने के लिए कोई भी नहीं। :(
यह कोको ट्यूटोरियल के लिए कुछ बेहतरीन चीजें बनाएगा, है ना?;

+0

NSDictionaryController भी है। यह नहीं पता कि यह आपको इस दिशा में कितना दूर करेगा, लेकिन एक नज़र डालें। –

+0

@ माइक यह नियंत्रक की इतनी समस्या नहीं है, लेकिन तालिका कक्षों में से एक इसकी कोशिकाओं को संभालने में सक्षम है। लेकिन वैसे भी धन्यवाद :) – Regexident

+0

लगभग 5 साल बाद और यह एकमात्र जानकारी थी जो मुझे अलग-अलग कोशिकाओं के साथ एक टेबल पर डेटा स्रोत के साथ बाध्यकारी मिश्रण के बारे में मिल सकती थी, "यह कोको ट्यूटोरियल के लिए कुछ बेहतरीन चीजें बनाती है, है ना?" , धत्त हां! – rraallvv

उत्तर

3

कॉलम का डेटा सेल कॉपी नहीं किया गया है। सेल को प्रत्येक पंक्ति में कॉलम के उचित मान के लिए कॉन्फ़िगर किया गया है और इसकी उचित जगह पर खींचा गया है। एनएसटीबल कॉलम विधि -dataCellForRow: पर हुक करने के लिए एक अच्छी जगह है। कस्टम उप-वर्ग में, आप इस विधि को ओवरराइड कर सकते हैं और सामान्य ऑपरेशन या कुछ वैकल्पिक सेल प्रकार के लिए या तोडेटासेल पास कर सकते हैं।

मेरे पास एक रूपरेखा दृश्य में "शामिल" का प्रतिनिधित्व करने वाला चेकबॉक्स कॉलम होने का अवसर था जो केवल बच्चों (गैर-रूट आइटम) के लिए दिखाई देता था। मूल वस्तुओं को केवल उनके बच्चों को बाहर नहीं किया जा सका, इसलिए यह केवल गैर-मूल वस्तुओं के लिए चेकबॉक्स दिखाने के लिए समझ में आया।

मैंने एक कस्टम एनएसटीबल कॉलम सबक्लास बनाया जिसने एक प्रतिनिधि (मेरा डेटा स्रोत नियंत्रक) लिया और यह देखने के लिए जांच की कि क्या यह चयनकर्ता -deadCellColumn का जवाब देता है: shouldShowDeadCellForRow:। यदि ऐसा होता है, तो मैंने यह तरीका पूछने के लिए उस विधि को (जिसे मेरे डेटा स्रोत नियंत्रक पर लागू किया गया था) कहा था कि मुझे "मृत सेल" (एक मूल एनएससीएल सबक्लास जो कुछ भी नहीं खींचता) दिखाएगा और जवाब के अनुसार इसे बदल दिया है। अगर प्रतिनिधि ने चयनकर्ता का जवाब नहीं दिया, तो तालिका कॉलम सामान्य -डेटासेल लौटाता है।

कस्टम सेल (जिसे मैंने "डेडसेल" कहा था) की आवश्यकता थी क्योंकि मैं यह सुनिश्चित करना चाहता था कि कुछ भी तैयार नहीं हुआ और कुछ भी संपादन योग्य नहीं था। मुझे यकीन नहीं है कि यह सख्ती से जरूरी था लेकिन मैंने वैसे भी किया। यह आपके मामले में ज्यादा उपयोग नहीं है, लेकिन मैं इसे पूर्णता के लिए वैसे भी कहना चाहता हूं।

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

+0

ओह मेरा ... मुझे लगता है कि मैं _'just'_ को अपने डेटा इनपुट को एकजुट करना होगा (टेम्पलेट मानों तक आसान पहुंच के लिए कॉम्बोबॉक्सकल्स का उपयोग करके) और प्रत्येक आइटम के मान प्रकार के लिए उचित इनपुट सुनिश्चित करने के लिए NSFormatters का उपयोग करें। सुंदर नहीं है, लेकिन इस तरह के टेबल व्यू की आवश्यकता वाले फीचर को इतना बड़ा बैकएंड कोड और संभावित हैकर में निवेश करने के लिए पर्याप्त/महत्वपूर्ण नहीं है। मेजर बमर हालांकि इस तरह की चीजें काम करने के लिए इतनी गड़बड़ है। – Regexident

+0

कोई हैकरी बिल्कुल शामिल नहीं है। यह नियंत्रण/सेल तंत्र के सभी वैध उपयोग है। इसके अलावा, कोको बाइंडिंग चीजों के 'त्वरित अनुप्रयोग विकास' पक्ष की ओर अधिक हैं, जो केवल अधिक सामान्यीकृत मामलों के लिए कोड को समाप्त करता है। यदि आप विशेष चीजें करना चाहते हैं, तो आपको कोड का उपयोग करना होगा। कई परिस्थितियों में, आप दो (बाइंडिंग और डेटा स्रोत) मिश्रण कर सकते हैं। इस स्थिति में, यदि आपके सेल प्रकार सभी एक ही बाइंडिंग साझा करते हैं, तो आपको केवल अपने कस्टम कॉलम की आवश्यकता होती है और बाकी सब कुछ "बस काम करना चाहिए"। –

+0

हाँ, लेकिन वे ** ** ** समान बाइंडिंग साझा नहीं करते हैं :( और यह सुविधा एक बहुत ही सीमित संभावित उपयोगकर्ताबेस के साथ एक बेईमानी होगी, इसलिए उत्पाद रिलीज में देरी के दौरान इतनी अत्यधिक प्रयास के लायक नहीं है। ("महान डेवलपर्स जहाज", दाएं?;) लेकिन समाधान के लिए धन्यवाद। मुझे यकीन है कि इसके लिए मेरे पास कुछ उपयोग नहीं होगा। – Regexident