Sunday, 15 August 2010

objective c - Something doesn't feel right about how I am dynamically populating an NSTableView -


यहां मेरी ऑब्जेक्ट पदानुक्रम है: NSWindowController एक NSViewController , जो कि डेटा स्रोत & amp; प्रतिनिधि मेरे NSTableView के लिए।

NSWindowController इंटरनेट से कुछ डेटा प्राप्त करता है, और इसे NSViewController ताकि यह NSTableView को पॉप्युलेट कर सके। यह एसिंक्रोनस होता है, इसलिए NSTableView को शुरू में 0 पंक्तियों से लोड किया जाता है।

NSViewController का मालिक NSTableView , साथ ही साथ एक NSArray ( डेटा स्रोत के रूप में)। इन दोनों गुण निजी हैं

यहां से मुझे अपने कार्यान्वयन में विश्वास नहीं है: एक बार जब NSWindowController ने डेटा प्राप्त कर लिया है, मैं NSViewController जिसे मैंने नाम दिया है -addStringToArray: (NSString *) (ऐरे को सार्वजनिक करने से बचने के लिए और फिर सीधे -addObject को NSArray पर कॉल करना) )। -addStringToArray बस तब निजी NSArray पर -addObject को कॉल करता है, और भी कॉल [self.tableView reloadData] । इस स्थान पर यह कॉल है, जहां मैं ज्यादातर स्केच आउट हूं (हालांकि मैं अपने समाधान के किसी भी भाग पर ख़ुशी से कोई इनपुट ले सकता हूं)

क्योंकि जब NSTableView लोड होता है, इसकी 0 पंक्तियाँ हैं, जब डेटा स्रोत ( NSViewController ) विधि -numberOfRowsInTableView को कहलाता है, यह 0 देता है। यह बदले में यह इसलिए बनाता है प्रतिनिधि विधि -viewForTableColumn ... कभी नहीं कहा जाता है, क्योंकि (मैं मान रहा हूँ) यह मानता है कि वहाँ 0 पंक्तियाँ हैं।

इसे पाने के लिए कॉल करने के लिए विधि, मुझे NSTableView 's -reloadData कॉल करने की आवश्यकता है।

टीएल; डीआर : तालिका प्राप्त हो जाती है 0 पंक्तियों से भरा हुआ एक सरणी में तार जोड़ें। हर बार एक स्ट्रिंग कॉल reloadData जोड़ा जाता है। यह कॉल -numberOfRowsInTableView , जो सरणी का आकार देता है। यह भी -viewForTableColumn ... को कॉल करने की अनुमति देता है, जो फिर उपयुक्त स्ट्रिंग देता है जो तब तालिका को पॉपुलेट करता है।

क्या मैं अपने NSTableView में आइटम को सबसे अच्छे तरीके से जोड़ रहा हूं संभव है?

आपका दृष्टिकोण ठीक है यह मानते हुए कि आप 10.7 या उसके बाद के लिए तैनाती को लक्षित कर रहे हैं, आप अपने डेटा मॉडल को बदलने के बाद - [NSTableView insertRowsAtIndexes: withAnimation:] का उपयोग कर सकते हैं। इससे डेटा के पूर्ण पुनः लोड से बचा जाता है।


No comments:

Post a Comment