2010-10-20 9 views
13

मै मैक के लिए नया हूँ। मैं -reloadData का उपयोग किए बिना NSTableView में किसी विशेष सेल को अपडेट करने का प्रयास कर रहा हूं, क्योंकि -reloadData संपूर्ण तालिका अपडेट करता है। मैंने सब कुछ करने की कोशिश की है लेकिन सभी व्यर्थ में थे। मैं एमएफसी में या .NET में CListCtrl में जो कुछ भी करता था, उसके समान कुछ करने की कोशिश कर रहा हूं।-reloadData का उपयोग किए बिना NSTableView को कैसे अपडेट करें?

+1

मुझे थोड़ा अधिक है, मैं डॉन स्पष्ट करते हैं टेबल को फिर से खींचा जाना नहीं चाहता। मुझे कुछ विधि चाहिए जिसमें मैं row_number, column_number या NSTableColumn, और (id) dataobject पास कर सकता हूं। – Omayr

+10

@ माइक अब्दुल्ला मैंने सराहना की होगी कि आपने इसके बजाय समाधान का प्रस्ताव दिया था! – Omayr

+3

किसी समुदाय में शामिल होने पर, आमतौर पर उस समुदाय के सम्मेलनों को ध्यान में रखना और अपनाना एक अच्छा विचार है। मैक डेवलपर समुदाय के मामले में, "मैक" प्लेटफॉर्म की अज्ञानता को इंगित करता है। –

उत्तर

27

reloadDataForRowIndexes:columnIndexes: विधि पर एक नज़र डालें। किसी एकल कक्ष अद्यतन करने के लिए निम्नलिखित काम करना चाहिए:

[yourTable reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:row] 
        columnIndexes:[NSIndexSet indexSetWithIndex:column]]; 
+0

डॉक्स लिंक: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/Reference/Reference.html#//apple_ref/occ/instm/NSTableView/reloadDataForRowIndexes:columnIndexes: –

+0

हालांकि यह सही समाधान है, यह उल्लेख किया जाना चाहिए कि reloadData() भी वर्तमान में दृश्यमान कोशिकाओं को फिर से प्रस्तुत करता है, न कि संपूर्ण तालिका। – Matt

-3

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

+2

मैं दक्षता के कारण ऐसा करना चाहता हूं।जैसे मुझे प्रति सेकंड 8-10 कोशिकाओं को अपडेट करने की आवश्यकता है, इस मामले में मैं पूरी तालिका को बार-बार अपडेट नहीं करना चाहता हूं! – Omayr

18

यह आमतौर पर कोको में काम करने के तरीके और कुछ अन्य ढांचे में काम करने के तरीके के बीच एक मौलिक अंतर है। एनएसटीबल व्यू -reloadDataForRowIndexes:columnIndexes: एपीआई का पर्दाफाश करता है, जैसा कि व्लादिमीर बताता है, लेकिन आपको "withObject:" पैरामीटर की अनुपस्थिति दिखाई देगी।

ऐसा इसलिए है क्योंकि कोको दृश्य और नियंत्रण डेटा कंटेनर के रूप में कार्य करने के लिए डिज़ाइन किए गए हैं। इसके बजाय, वे डेटा के साथ प्रस्तुति और बातचीत के लिए हैं जो किसी अन्य मॉडल ऑब्जेक्ट द्वारा प्रबंधित किया जाता है, आमतौर पर किसी प्रकार के मध्यवर्ती नियंत्रक के माध्यम से। एक दिखाया गया है, अगर वहाँ भी है -

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

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

1

reloadDataForRowIndexes का उपयोग कर सभी पंक्तियों लेकिन केवल एक एकल स्तंभ अद्यतन करने के लिए की एक पूरी उदाहरण: एक ही पंक्ति के लिए

int col = 2 ; 
[self.myTable reloadDataForRowIndexes: 
    [NSIndexSet indexSetWithIndexesInRange: 
     NSMakeRange(0,self.myTable.numberOfRows)] 
    columnIndexes: 
     [NSIndexSet indexSetWithIndex:col] 
]; 

या सभी स्तंभ:

int row = 2 ; 
[self.myTable reloadDataForRowIndexes: 
    [NSIndexSet indexSetWithIndex:row] 
columnIndexes: 
    [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.myTable.numberOfColumns)] 
]; 
+0

अपने दूसरे उदाहरण में, 'reloadDataForRowIndexes: columnIndexes:' [NSIndexSet indexSetWithIndexesInRange: NSMakeRange (0, _tableView.numberOfColumns)] '' नहीं एक NSRange ताकि आप की तरह कुछ करने की जरूरत है ले जा सकते हैं, – TheNextman