2011-08-17 17 views
16

को दृश्य-आधारित NSOutlineView मैं अपने मैक अनुप्रयोग में एक स्रोत सूची के रूप में नए दृश्य-आधारित OutlineView लागू करने के लिए कोशिश कर रहा हूँ। मुझे प्रदर्शित करने के लिए मूल्य नहीं मिल सकते हैं, हालांकि, मैंने कोर डेटा ऐप टेम्पलेट से एक छोटा परीक्षण ऐप बनाया है, और इसे वहां पर काम नहीं कर सकता है।बाध्यकारी कोर डाटा

मैं अपने डेटा मॉडल में दो साधारण कक्षाओं में परिभाषित किया गया; चलो उन्हें "अभिभावक" और "बच्चा" कहते हैं। अभिभावक में एक ही विशेषता है, "नाम", और एक ही रिश्ते, "बच्चे"। नाम एक वैकल्पिक स्ट्रिंग है, और बच्चेबच्चे पर कई से अधिक रिश्तों के लिए वैकल्पिक है। बाल एक ही "नाम" विशेषता है और एक टू-वन "जनक" संबंध बच्चों का उल्टा होता है कि नहीं है। मैं उन दोनों के लिए कस्टम कक्षाओं उत्पन्न, और बालमें एक ठूंठ लिखा बच्चों कि nil रिटर्न के लिए।

मैं अपने XIB पर वस्तु पुस्तकालय से एक स्रोत सूची घसीटा, और एक पेड़ नियंत्रक में गिरा दिया। ट्री नियंत्रक बच्चे कुंजी पथ "बच्चों" के लिए सेट है, यह, के रूप में इकाई नाम "पिता" के साथ, इकाई नाम मोड में है जाँच की सामग्री तैयार करता है, और इसके प्रबंधित ऑब्जेक्ट संदर्भ एप्लिकेशन प्रतिनिधि के संदर्भ के लिए निर्धारित किया है। ट्री कंट्रोलर रूपरेखा दृश्य का डेटा स्रोत है, और मैंने डेटा सेल के टेक्स्ट व्यू को "objectValue.name" कुंजी पथ के साथ तालिका कक्ष दृश्य में बाध्य किया है।

-applicationDidFinishLaunching: में

मैं दो जनक उदाहरणों, एक बाल के साथ एक बनाते हैं, और हर वस्तु के नाम संपत्ति आवंटित।

वास्तविक समस्या

No text

अब, रास्ते से बाहर है कि सेटअप के साथ, मैं स्रोत सूची में प्रदर्शित पंक्तियों मिलता है, लेकिन पाठ फ़ील्ड खाली हैं, वे कर रहे हैं, भले ही बाध्य। मुझे नहीं लगता कि मुझे कुछ और करने की ज़रूरत है, क्योंकि मैं बाइंडिंग का उपयोग कर रहा हूं, और मैं objectValue संपत्ति के लिए काफी बाध्यकारी हूं, यह सही बात है। क्या गलत हो रहा है?

यदि आवश्यक हो तो मैं अधिक जानकारी प्रदान कर सकता हूं, लेकिन मुझे पूरा यकीन है कि मैंने जो भी किया वह सब कुछ शामिल है।

+0

में पाया जा सकता तो आप इस काम करने के लिए मिला? मुझे एक ही समस्या थी, इसलिए मैंने आपकी परियोजना को डुप्लिकेट करने का प्रयास किया। लेकिन मैं एक डॉक्टर आधारित ऐप का उपयोग कर रहा हूँ। मेरे प्रतिनिधि तरीकों को कभी नहीं बुलाया जाता है और मुझे मेरी कोशिकाओं में कोई टेक्स्ट मान नहीं मिलता है। हालांकि, वे सही डेटा रखते हैं। क्या आपके पास कहीं भी काम करने वाला कोड है, मैं देख सकता हूं? बहुत सराहना करेंगे! मैं अपनी टेस्ट प्रोजेक्ट को जिथब में अपलोड कर सकता हूं। – Mikael

+1

क्या आपने अपना व्यू कंट्रोलर प्रतिनिधि के रूप में चिह्नित किया था? यदि प्रतिनिधि विधियों को बिल्कुल नहीं बुलाया जा रहा है, तो आपका तार शायद गलत है। अगर यह आपके लिए इसे ठीक नहीं करता है, तो आपको अपना प्रश्न पोस्ट करना चाहिए। – Dov

+0

विश्वास नहीं कर सकता मैं इसे याद किया। आपका बहुत बहुत धन्यवाद! – Mikael

उत्तर

23

वाह, यह दो हफ्ते पहले मेरे जैसा है, इस सवाल से पूछ रहा है।

वैसे भी, अगर तुम मुझे ऐसा कुछ कर रहे हैं, समस्या यह है कि,
के लिए दृश्य-आधारित NSOutlineViews, आप

- (NSView *)outlineView:(NSOutlineView *)outlineView 
    viewForTableColumn:(NSTableColumn *)tableColumn 
        item:(id)item; 

प्रतिनिधि विधि को लागू करने और NSTableCellView आप की स्थापना की,
वापस जाने के लिए की जरूरत है या वे आपको एक खाली रेखा देंगे। यह करने के लिए सबसे आसान तरीका है बस जो आप अपने NSTableCellView के लिए "उपयोगकर्ता इंटरफ़ेस आइटम पहचानकर्ता"
पहचान इंस्पेक्टर के रूप में टाइप के साथ MyCell जगह

[outlineView makeViewWithIdentifier:@"MyCell" owner:self] 

कॉल करने के लिए है।

+0

आपका उत्तर, जबकि यह सही लगता है, बाइंडिंग का उपयोग नहीं करता है। – Richard

+6

बाइंडिंग का उपयोग करने के अलावा आपको इसे लागू करने की आवश्यकता है। बाइंडिंग अभी भी सेल व्यू के ऑब्जेक्ट वैल्यू को सेट करने और उस ऑब्जेक्ट के सेल दृश्य के सबव्यूज़ को बाध्य करने के लिए बाध्य कर सकते हैं। लेकिन इस विधि को अभी भी एक विशेष पंक्ति/कॉलम के लिए उपयोग करने के लिए सेल दृश्य देखने के लिए आवश्यक है। –

+6

यह आवश्यक है, क्योंकि स्रोत सूची एक ही कॉलम में हेडरसेल और डेटासेल में दो अलग-अलग कोशिकाओं का उपयोग करती है, और यह आपके लिए एक नहीं चुन सकती है, जैसे कि अगर आपके पास केवल एक सेल हो और उसका पहचानकर्ता स्वचालित रूप से सेट हो । – Dov

5

जैसा बोअज़ ऊपर उल्लेख किया गया है, आपको दृश्य को वापस करने के लिए प्रतिनिधि विधि को लागू करने की आवश्यकता है। काफी रहस्य है कि मुझे डॉक्स में उस विधि को नहीं मिला। (आईडी) आइटम पैरामीटर के प्रकार के बारे में, यह एक NSTreeControllerTreeNode है जो NSTreeNode का एक अनियंत्रित उप-वर्ग है। यदि आप इसे कास्ट करते हैं तो आप सेल की ऑब्जेक्ट प्राप्त कर सकते हैं, और अलग-अलग दृश्य वापस कर सकते हैं कि किस प्रकार की ऑब्जेक्ट है, या उस ऑब्जेक्ट के जो भी गुण सेल व्यू प्रकार निर्धारित करते हैं। उदाहरण के लिए

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
NSTableCellView *view = nil; 

NSTreeNode *node = item; 

if ([node.representedObject isKindOfClass:[Group class]]) { 
    view = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
} else { 
    view = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
} 
return view; 
} 
4

यह एक्सकोड 4 या उसके लिए एक बदलाव के रूप में दिखाई दिया। इंटरफ़ेस बिल्डर NSOutlineView के तहत दो NSTableCellView ऑब्जेक्ट्स जोड़ता है। आप हटाना NSTableCellView वस्तुओं यदि आप एक saner पर लौट (या कम से कम दस्तावेज) दुनिया जहां outlineView लागू करेगा की जरूरत है: dataCellForTableColumn: आइटम और outlineView: willDisplayCell: forTableColumn: आइटम

... या कम से कम आप तो क्या आप एक स्रोत सूची देखना चाहते हैं। किसी भी मामले में SourceView नमूना सेटअप किया गया है और इसलिए, जब आप SourceView नमूना को फिर से बनाने का प्रयास करते हैं जिसे आप इस तरह की गड़बड़ी में प्राप्त कर सकते हैं।

वैकल्पिक रूप से, अगर आप NSTableCellView वस्तुओं का उपयोग जारी रखना चाहते हैं (जो काफी उपयोगी होते हैं) तो आप कर सकते हैं:

  • बाँध NSOutlineView अपने TreeController.arrangedObjects को 'सामग्री'

  • बाँध NSTextField (और/या NSImageView) NSTableCellView के तहत ऑब्जेक्ट के मॉडल कुंजी पथ के साथ 'टेबल सेल व्यू' पर। < कुंजी>

0

मैं एक छोटे से नमूना परियोजना जो भी popuplates एक NSOutlineView popuplates, CoreData के साथ नहीं, बल्कि महत्वपूर्ण कारक की तरह @ बोअज-stuller ने कहा कि सही सेल चयन किया जाता है (आप कैसे के समान है, है बनाया है आईओएस में संभाल UITableViewCell रों

तो my case में मैं बहुत की तरह विधि को लागू किया है:।।

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 

    if ([self isHeader:item]) { 
     return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
    } else { 
     return [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
    } 
} 

GitHub पर बाहर की जाँच करें besi/mac-quickies सामान में से अधिकांश या तो आईबी में किया जाता है या AppDelegate

screenshot