2013-02-11 41 views
5

मैं अपने व्यू-आधारित-एनएसटीबलव्यू को पहले से जेनरेट की गई तालिकासेल दृश्यों का पुन: उपयोग नहीं करना चाहूंगा जो दायरे से बाहर स्क्रॉल किए गए हैं। मुझे लगता है कि यह UITableView के साथ dequeueReusableCellWithIdentifier ओवरराइटिंग के साथ संभव होगा: शून्य वापस करने के लिए। क्या एनएसटीबल व्यू के लिए समान समाधान है?NSTableView को पुन: उपयोग करने के लिए कैसे करें TableCellViews

-

मेरे पृष्ठभूमि: मैं एक काफी जटिल दृश्य-आधारित-tableView हमेशा की तरह ManagedObjects करने के लिए बाध्य (यानी टेबल सामग्री, -selection और -sortdescriptor एक arraycontroller और tableCellView-तत्वों के लिए बाध्य कर रहे हैं ऑब्जेक्ट बाध्य करें)।

तालिका में लगभग 20 कॉलम हैं लेकिन अधिकांश 400 पंक्तियां हैं। स्क्रॉलिंग वास्तव में धीमी है, लेकिन टाइम-प्रोफाइलिंग इंगित करती है कि धीमापन का कोई भी स्रोत मौजूद नहीं है (सबसे बड़ी एकल विधि-कॉल में लगभग 5% समय लगता है)। मेरे प्रबंधित ऑब्जेक्ट के व्युत्पन्न/कस्टम गुणों को कैश करने के बाद बहुत अधिक प्रदर्शन-बढ़ावा के बिना, अब मैं विचारों को कैश करने की कोशिश कर रहा हूं (तालिका दृश्य के लगातार पुनरुत्थान से बचने के लिए जब दृश्य दृश्य में आता है)।

मैं इस समय कोशिश कर रहा हूं कि तालिका-सामग्री को बाध्य न करें, लेकिन NSDatasource-प्रोटोकॉल का उपयोग करके मेरे विचार प्राप्त करें।

-(NSView*) tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 

यदि वे मौजूद हैं तो मैं कैश किए गए TableCellViews को वापस करना चाहूंगा। अन्यथा मैं के बाद से makeViewWithIdentifier बार देखा गया है कि पहले से ही मुझे द्वारा कैश कर रहे हैं वापस आ सकते हैं के माध्यम से

[self.table makeViewWithIdentifier:... owner:self]; 

एक नया बना, टेबल-सामग्री गलत कोशिकाओं के साथ में गड़बड़ हो जाता है।

प्रदर्शन काफी इस दृष्टिकोण के साथ बेहतर है ...

-

बनाने स्क्रॉल अधिक performant भी appriciated कर रहे हैं पर अन्य विचारों।

+0

मुझे यह जानने में दिलचस्पी होगी कि आपको इसके साथ कहीं भी मिला है या नहीं। मुझे लगता है कि मेरे विपरीत समस्या है कि मेरे NSTableView कुछ कारणों से * कोशिकाओं का पुन: उपयोग नहीं कर रहा है। मैंने PXListView की कोशिश की, लेकिन उसमें खराब प्रदर्शन और बहुत सारी बग थी, इसलिए मैं एनएसटीबल व्यू के साथ रहना चाहता हूं लेकिन यह काम करता हूं कि इसे कैश दृश्य कैसे बनाएं, जो मुझे लगता है कि ऐसा करना है। जहां तक ​​आपकी समस्या है, क्या आप प्रत्येक दृश्य के लिए एक अद्वितीय पहचानकर्ता बनाने में सक्षम होंगे या क्या यह भयानक स्मृति उपयोग का कारण बन जाएगा? – danpalmer

उत्तर

7

अपनी तालिका में देखें: viewForTableColumn: कार्यान्वयन को वापस देखने के लिए .indidentifier को शून्य पर सेट करें। इससे टेबल को कैशिंग करने से रोका जा सकेगा। फिर आप अपना खुद का कैश प्रबंधित कर सकते हैं। एफडब्ल्यूआईडब्ल्यू, आपको मेकव्यूविथ इंडेंटिफायर का भी उपयोग करने की ज़रूरत नहीं है: बिलकुल भी; आप उस विधि का उपयोग करने के बजाय मैन्युअल रूप से स्क्रैच से अपने विचार बना सकते हैं (जो पूर्व-सेटअप दृश्य एनआईबी बनाता है)।

हालांकि, यदि आपको प्रदर्शन की समस्याएं आ रही हैं, तो धीमे और क्यों देखकर उन लोगों को संबोधित करना बेहतर होगा। आपने यह जानकारी प्रदान नहीं की कि यह धीमा क्यों है, इसलिए यह कहना मुश्किल है कि क्या करना है। 20 कॉलम बहुत है। CanDrawSubviewsIntoLayer, NSTableCellView, या NSTableRowView पर, आप अपनी परत गणना को कम करने का प्रयास करके बेहतर प्रदर्शन प्राप्त कर सकते हैं। लेकिन ऐसा करने के बारे में जागरूक होने के लिए कई चेतावनी और चीजें हैं।

कॉर्बिन

+0

इसके अलावा, UIKit और dequeueReusableCellWithIdentifier की तरह :, आप makeViewWithIdentifier को ओवरराइड कर सकते हैं और अपनी कैशिंग तंत्र को कार्यान्वित कर सकते हैं (या इसे शून्य वापस कर सकते हैं)। –

+0

क्या आप कह रहे हैं कि तालिका दृश्य से वापसी: viewForTableColumn: केवल पुन: उपयोग पूल को कैशिंग करने के लिए उपयोग किया जाता है?क्या इस बारे में कोई वर्तमान जानकारी है कि कितने विचार बेहद धीमे होंगे या यह जानने का एक तरीका है कि पुन: उपयोग पूल कितना बड़ा है? यह जानने का कोई तरीका है कि स्क्रॉल व्यू को ओवरराइड एपीआई में कैसे जोड़ सकता है? – uchuugaka

+1

नहीं, यही वह नहीं है जो मैंने कहा था। तालिका दृश्य से वापसी: viewForTableColumn: यह बहुत ही दृश्य है कि तालिका उस स्थान पर रखती है। जब तालिका दृश्य को हटाने के लिए जाती है (क्योंकि इसकी आवश्यकता नहीं होती है), तो केवल तभी कैश किया जाता है जब दृश्य। पहचानकर्ता गैर-शून्य है। अन्यथा, दृश्य फेंक दिया जाता है और मुक्त हो जाता है। –