2011-06-06 21 views
13

मेरे पास NSTableView निर्देशिका की सामग्री दिखा रहा है। मैं FSEvents के लिए देखता हूं, और हर बार जब मुझे कोई ईवेंट मिलता है तो मैं अपना टेबल व्यू पुनः लोड करता हूं। दुर्भाग्यवश, वर्तमान चयन तब गायब हो जाता है। क्या इससे बचने का कोई तरीका है?एनएसटीबल व्यू में पुनः लोडडाटा लेकिन वर्तमान चयन

उत्तर

4

यह इस बात पर निर्भर करता है कि आप अपने एनएसटीबल व्यू को कैसे पॉप्युलेट करते हैं।

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

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

आप एक NSArrayController का उपयोग नहीं कर रहे हैं, तो हो सकता है लेकिन एक डेटा स्रोत का उपयोग कर तालिका दृश्य को भरने के लिए है, तो मुझे लगता है कि आप चयन अपने आप को प्रबंधित करने के लिए होगा।

+0

स्पष्टीकरण के लिए धन्यवाद। मैं वास्तव में एक एनएसएआरएआर कंट्रोलर –

+2

का उपयोग करने के बारे में सोच रहा हूं, मैंने सेटप्रेशर्सेस चयन को अविश्वसनीय पाया। कभी-कभी यह काम करता है, कभी-कभी ऐसा नहीं होता है। –

9

ठीक है, आपको बुला रहा reloadData से पहले चयन बचाने के लिए और उसके बाद इसे फिर से स्थापित कर सकते हैं।

NSInteger row = [self.tableView selectedRow]; 
[self.tableView reloadData]; 
[self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO]; 

यह कुछ मामलों में मेरे लिए काम करता है। लेकिन अगर आप चयनित पंक्ति से पहले कुछ आइटम डालें, आपको उसमें शामिल आइटम की गणना जोड़कर अपनी पंक्ति चर और सिर्फ चाहिए।

3

@ silvansky के जवाब का एक और प्रकार।

यह एक डाला/हटाए गए आइटम की गिनती का ट्रैक रखने की कोई जरूरत नहीं है। और यह कई चयन बनाए रखता है।

विचार है ...
1. वर्तमान चयन से चयनित ऑब्जेक्ट्स/नोड्स की एक सरणी बनाएं।
2. चरण 1 में प्राप्त प्रत्येक वस्तु के लिए reloadData
3. का उपयोग कर तालिका ताज़ा/मिल जाए, यह नया सूचकांक
4. है अद्यतन सूचकांक सेट

- (void)refresh { 
    // initialize some variables 
    NSIndexSet *selectedIndexes = [self.outlineView selectedRowIndexes]; 
    NSMutableArray *selectedNodes = [NSMutableArray array]; 
    NSMutableIndexSet *updatedSelectedIndex = [NSMutableIndexSet indexSet]; 

    // 1. enumerate all selected indexes and record the nodes/objects 
    [selectedIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { 
     [selectedNodes addObject:[self.outlineView itemAtRow:idx]]; 
    }]; 

    // 2. refresh the table which may add new objects/nodes 
    [self.outlineView reloadData]; 

    // 3. for each node in step 1, find the new indexes 
    for (id selectedNode in selectedNodes) { 
     [updatedSelectedIndex addIndex:[self.outlineView rowForItem:selectedNode]]; 
    } 

    // 4. tell the outline view to select the updated index set 
    [self.outlineView selectRowIndexes:updatedSelectedIndex byExtendingSelection:NO]; 
} 
+0

ब्रैड, क्या आपने यह कोशिश की? reloadData आलसी लोड हो गया है ताकि आपके पास कॉल के बाद अपडेट किया गया डेटा न हो। परीक्षण करने के लिए इस कोड को ड्रैग/मूव ऑपरेशन के बाद आज़माएं जो पंक्तियों के क्रम को बदलता है। मुझे नहीं लगता कि यह वांछित परिणाम देगा। –

+0

@SteveSheldon मुझे यह काम याद है, लेकिन दुर्भाग्यवश यह प्रोजेक्ट अब नहीं चलता है इसलिए मैं अब और परीक्षण नहीं कर सकता। –

+0

@SteveSheldon, मुझे लगता है कि यह काम करता है; मैंने एक समान तकनीक का उपयोग किया है; और अगर मुझे याद है, ऐप्पल के दस्तावेज़ भी इसका जिक्र करते हैं। आप किस अद्यतन डेटा का जिक्र कर रहे हैं? और किस कॉल के बाद? – Jerry

3
चयन करने के लिए तालिका दृश्य/रूपरेखा दृश्य बता रिकॉर्ड

reloadData() पर हेडर फाइल में डेटा स्रोत, एप्पल प्रलेखन का उपयोग कर के मामले में है कि

चयनित पंक्तियों नहीं रखा जाता है।

आसपास जाने के लिए, आप reloadDataForRowIndexes(rowIndexes: NSIndexSet, columnIndexes: NSIndexSet) का उपयोग कर सकते हैं। जैसा कि एक ही शीर्षलेख फ़ाइल

दिखाई देने वाली कोशिकाओं के लिए उपयुक्त डेटा स्रोत और प्रतिनिधि विधियों को बुलाया जाएगा और कोशिकाओं को फिर से खींचा जाएगा।

इस प्रकार डेटा फिर से लोड किया जाएगा, और चयन भी रखा जाता है।

4

[स्विफ्ट 3]

एक विस्तार बनाएँ और एक तरीका है जिसके चयन को बरकरार रखता है जोड़ें।

extension NSTableView { 

    func reloadDataKeepingSelection() { 
     let selectedRowIndexes = self.selectedRowIndexes 
     self.reloadData() 
     self.selectRowIndexes(selectedRowIndexes, byExtendingSelection: true) 
    } 
} 

मामले में यह क्या आप तालिका दृश्य (नहीं NSArrayController) को आबाद करने के पारंपरिक तरीके से इस्तेमाल करते हैं।

+0

छोटा नोट, यह पहले और पिछले चयनित आइटम का चयन करेगा, "byExtendingSelection" को गलत पर सेट करें यदि आप केवल पहले चयनित आइटम चाहते हैं –