2009-12-01 11 views
23

मैं आईफोन में कस्टम जैबर क्लाइंट लिखता हूं।पुनः लोड करने के बाद UITableView में चयनित पंक्ति को सहेजें डेटा

मैं xmppframework इंजन के रूप में उपयोग करता हूं।

और मेरे पास पुन: संपर्क संपर्क सूची के लिए एनएसएमयूटेबलएरे के साथ UITableViewController है।

जब मुझे प्राप्त होता है (या कोई इसे सामग्री बदलता है) रोस्टर (उर्फ संपर्क सूची) मैं UITableView आइटम (जोड़ें/निकालें/संशोधित) बदलना चाहता हूं। इसलिए यदि उपयोगकर्ता सूची के साथ काम करता है तो

[items addObject:newItem]; 
[self.tableView reloadData]; 

उपयोगकर्ता द्वारा वर्तमान चयन आइटम खो गया है।

तो, मेरा प्रश्न है कि कैसे बचाएं (यदि संभव हो, तो मेरा मतलब है कि चयनित आइटम को हटाया नहीं गया है) वर्तमान लोड आइटम को पुनः लोड करने के बाद?

Thx।

उत्तर

-5

ऐसा लगता है कि आप डेटा के लिए 'मॉडल' का उपयोग नहीं कर रहे हैं - बल्कि 'दृश्य' (उपयोगकर्ता इंटरफ़ेस) को अपडेट करना, और इस प्रकार शायद एक खराब डिज़ाइन है।

reloadData को मॉडल से डेटा के साथ अद्यतन को अद्यतन करना चाहिए, जिसमें प्रदर्शित होने वाला सबसे वर्तमान डेटा होना चाहिए।

'मॉडल दृश्य नियंत्रक पैटर्न'

+0

नहीं , मैं वास्तव में प्रतिनिधि तालिका डेटा स्रोत के लिए एनएसएमयूटेबलएरे का उपयोग करता हूं और इस सरणी में डेटा जोड़ता/हटाता हूं, लेकिन रीफ्रेश टेबल बनाने के लिए मैं सरणी को संशोधित करने के बाद पुनः लोडडेटा विधि कॉल करता हूं। क्या मैं सही हू? लेकिन इस तालिका के बाद चयन खो गया देखें। – vinnitu

+0

अपना कोड देखने के बिना आपकी मदद करना मुश्किल है, लेकिन तालिका दृश्य के तरीकों को डेटा स्रोत से तालिका बनाना चाहिए, इस प्रकार आप बस डेटा मॉडल और आग पुनः लोड डेटा अपडेट करें। – Mobs

3

वैकल्पिक हल reloadSections उपयोग करने के लिए है पर संसाधनों के लिए खोज: reloadData के बजाय। कुछ कारणों से reloadData वर्तमान चयन को हटा देता है।

NSIndexPath *ipath = [self.tableView indexPathForSelectedRow]; 
[self.tableView reloadData]; 
[self.tableView selectRowAtIndexPath:ipath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
+1

यह काम नहीं करता है। – ZaBlanc

+0

मेरे लिए पूरी तरह से काम करता है, धन्यवाद :) –

+5

मुझे खुद को सही करना है। यह आईओएस 4.0 में पूरी तरह से काम करता है लेकिन 4.2 और उच्चतर –

62

आसान तरीका कुछ इस तरह है। उपरोक्त कोड एक एक्सकोड टेम्पलेट है जिसे आप dispatch_after लिखना शुरू करते समय चुन सकते हैं।

+0

पर नहीं [सेल सेट चयनित: हाँ] सही तरीके से काम नहीं करता है। तो मैंने इस मेथोड का उपयोग किया जो ठीक काम करता है – Vassily

+0

पाया गया कि आपको इसे [self.tableView startUpdates]/[self.tableView endUpdates] में नहीं रखना चाहिए। – ChrisP

+1

ब्रावो, आपने मेरा दिन बचाया ... हैप्पी कोडिंग। – josh

1

यह मेरे लिए काम करता है::

NSIndexPath *indexPath = [table indexPathForSelectedRow]; 
[table reloadData]; 
double delayInSeconds = 0.01; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    [self.table selectRowAtIndexPath:indexPath animated:YES 
           scrollPosition:UITableViewScrollPositionNone]; 
}); 

चाल बाद में थोड़ा चलाने selectRowAtIndexpath बनाना है

+0

कोई विचार हमें कितनी देर तक देरी करने की आवश्यकता है? आईओएस 8 का उपयोग करते हुए मेरे मामले में, सिम्युलेटर पर, यह बग कभी नहीं हुआ, मुझे संदेह है क्योंकि सिम्युलेटर वास्तविक डिवाइस की तुलना में बहुत तेज था। लेकिन जब मैं इसे आईफोन पर परीक्षण करता हूं, तो मैंने देरी को 0.15 सेकेंड में सेट किया और मुझे अभी भी अपवाद मिला। – Kurotsuki

20

मार्को के जवाब देने के लिए एक सा जोड़ा जा रहा है: यदि आप कई चयन का उपयोग कर रहे

सबसे पहले, आप अपने ViewController को यह विधि जोड़कर उसे फोन जब भी आप कॉल करने की आवश्यकता कर सकते हैं [tableView reloadData]:

- (void)reloadTableView 
{ 
    NSArray *indexPaths = [self.tableView indexPathsForSelectedRows]; 
    [self.tableView reloadData]; 
    for (NSIndexPath *path in indexPaths) { 
     [self.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone]; 
    } 
} 

दूसरा, यदि आप UITableViewController में हैं और आप तालिका के बाद चयन को संरक्षित करना चाहते हैं तो दृश्य दिखाई देता है UITableViewController में एक विशेषता है: clearsSelectionOnViewWillAppear आप चालू या बंद कर सकते हैं।

यहाँ देखें: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html

+0

आप रॉक ब्रो, अच्छा समाधान, दिन – Aragunz

0

इस मामले के लिए एक समाधान है अगर आप तालिका अपडेट करते हैं और चयन रखना चाहते हैं: (

NSIndexPath* pathToSelect = [self.tableView indexPathForSelectedRow]; 
    if (pathToSelect && newRows) { 
     int row = pathToSelect.row; 
     for (NSIndexPath* path in newRows) { 
      if (path.section == pathToSelect.section && path.row <= pathToSelect.row) { 
       row++; 
      } 
     } 
     pathToSelect = [NSIndexPath indexPathForRow:row inSection:pathToSelect.section]; 
    } 

    [self.tableView beginUpdates]; 
    if (reloadRows) [self.tableView reloadRowsAtIndexPaths:reloadRows withRowAnimation:UITableViewRowAnimationFade]; 
    if (newSections) [self.tableView insertSections:newSections withRowAnimation:UITableViewRowAnimationFade]; 
    if (newRows) [self.tableView insertRowsAtIndexPaths:newRows withRowAnimation:UITableViewRowAnimationFade]; 
    [self.tableView endUpdates]; 

    if (pathToSelect) { 
     [self.tableView selectRowAtIndexPath:pathToSelect animated:NO scrollPosition:UITableViewScrollPositionNone]; 
    } 
4

मेरे लिए काम नहीं किया देरी जोड़ना आईओएस 8.4 और आईओएस 9 पर परीक्षण किया गया)। -selectRowAtIndexPath:animated:scrollPosition: पर कॉल करने के बाद, चयनित सेल पर -layoutIfNeeded पर कॉल जोड़ने का काम क्या था।

NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; 
[self.tableView reloadData]; 
[self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
[[self.tableView cellForRowAtIndexPath:selectedIndexPath] layoutIfNeeded]; 
+0

बचाया एक देरी अविश्वसनीय गंध, यह मेरे लिए काम किया। यदि आप इसे 'viewWillAppear' से कर रहे हैं, तो' सुपर' कॉल करने से पहले पुनः चयन करें। – Sebastian

0

आईओएस 9.3 और स्विफ्ट 2.x पर, मैं बस मुख्य थ्रेड :)

self.tableView?.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: .None) 
0

स्विफ्ट 3 पर समारोह कॉल करने के लिए किया था:

self.collectionView.reloadData() 
self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: []) 
संबंधित मुद्दे