2010-05-10 16 views
54

जब उपयोगकर्ता ने UITableView पंक्ति का चयन करने के बाद दृश्य को धक्का दिया, तो पंक्ति को नीली हाइलाइट मिलती है, और फिर नया दृश्य प्रकट होता है। कोई बात नहीं। लेकिन जब मैं 'बैक' जाता हूं तो पंक्ति अभी भी नीली रंग में हाइलाइट की जाती है। यहां मेरा किया गया चयन करेंटएंड इंडेक्सपैथ कोड है।चयनित UItableViewCell चयनित होने पर नीली रहना

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    SettingsViewController *controller = [[SettingsViewController alloc] initWithNibName:@"SettingsView" bundle:nil]; 
    [[self navigationController] pushViewController:controller animated:YES]; 
    [controller release], controller = nil; 
} 

क्या मैं गलत कर रहा हूँ?

उत्तर

170

ऊपर दिए गए उत्तरों के मुताबिक, आपको पंक्ति को स्पष्ट रूप से अचयनित करने की आवश्यकता है। आपके पास यह विकल्प है कि आप यह कैसे करते हैं। पहले, चयन के बाद तुरंत पंक्ति का चयन रद्द करने के लिए है:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ... 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

कि ठीक से काम करेंगे, लेकिन वहाँ एक विकल्प है, और उसके दृष्टिकोण UITableViewController द्वारा उठाए गए पंक्ति चयनित ही रहने देना है जो तब यह जब का चयन रद्द पुनः प्रकट होता है (जिस नियंत्रक को आप दबा रहे हैं उसके बाद स्टैक से पॉप किया गया है)।

इसका थोड़ा सा फायदा यह है कि उपयोगकर्ता वापस लौटने पर उनके पिछले चयन की झलक देखता है ताकि वे देख सकें कि उन्होंने पहले क्या चुना था।

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

जैसा कि मैंने कहा, यह क्या UITableViewController के viewWillAppear: के कार्यान्वयन के डिफ़ॉल्ट ऐसा नहीं करता है अगर आप UITableViewController और उपयोग कर रहे हैं नहीं देख:

यह लागू करने के लिए, तुम सिर्फ viewWillAppear ओवरराइड करने के लिए की जरूरत है यह व्यवहार, आपको यह जांचना चाहिए कि आप अपनी कक्षा के viewDidAppear: में super कार्यान्वयन को कॉल कर रहे हैं।

अपडेट (30 अक्टूबर 2013): अच्छा, यह एक लोकप्रिय जवाब है! चूंकि बेन टिप्पणियों में सही मायने में बताते हैं, UITableViewController वास्तव में viewWillAppear:viewDidAppear: में नहीं करता है - यह सही समय है। इसके अतिरिक्त, आप UITableViewController की clearsSelectionOnViewWillAppear प्रॉपर्टी का उपयोग करके इस व्यवहार को चालू और बंद कर देते हैं। मैंने इसे प्रतिबिंबित करने के लिए ऊपर दिए गए मेरे उत्तर में संशोधन किया है।

+0

सच अच्छा। इसके लिए धन्यवाद। – ToddB

+0

@ ल्यूक रेडपाथ कमाल ... धन्यवाद – death7eater

+1

यह एक अच्छा जवाब है, लेकिन मैं सुझाव दूंगा कि इसे 'viewWillAppear' में रखा जाना चाहिए ताकि UITableViewController deselection के समय की सटीक नकल हो सके। –

7

आप इसका चयन रद्द करने की जरूरत है:

[tableView deselectRowAtIndexPath:indexPath animated:YES];

3

तुम सिर्फ कॉल करने की आवश्यकता [tableView deselectRowAtIndexPath: indexPath एनिमेटेड: हाँ]।

1

UITableViewController का डिफ़ॉल्ट व्यवहार पंक्ति को अचयनित करता है जब उपयोगकर्ता विवरण दृश्य से लौटाता है। ल्यूक द्वारा दी गई प्रतिक्रिया ठीक है, लेकिन मैं इसके कारण को इंगित करना चाहता हूं:

1- यदि आपके पास UITableViewController है जैसे कि आपने इसे स्क्रैच से बनाया था, तो आपके पास सभी डिफ़ॉल्ट व्यवहार होंगे।

2- यदि स्थिति 1 में आप -viewWillAppear या -viewDidAppear जोड़ते हैं, तो आप मानक व्यवहार को ओवरराइट कर देंगे। उन्हें, यदि आप चाहते हैं कि पंक्ति बदले में अचयनित हो, तो आपको super स्पष्ट रूप से कहना होगा कि आप इसे हमेशा पंक्ति के रूप में स्वयं को अचयनित करना चाहते हैं!इस लक्ष्य को हासिल करने के लिए, के रूप में ल्यूक कहते हैं, आप [super viewWillAppear:animated] या [super viewDidAppear:animated] इस तरह कॉल करना होगा:

-(void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 

    // Here goes all of your stuff 
} 
0

एक अन्य समाधान अपने नियंत्रक UITableViewController पर आधारित है viewWillAppear

+0

हां, लेकिन मुझे लगता है कि इसे पुनः लोड करने के लिए कॉल के साथ किसी के कोड को छिड़कने के लिए अच्छा रूप नहीं माना जाता है। अक्सर एक अधिक प्रदर्शन समाधान होता है। –

4

में UITableView के reloadData कॉल करने के लिए है, तो आप के लिए यह सुविधा करने के मुक्त। लेकिन मैं अक्सर UIViewController का उपयोग करके समाप्त हुआ। UITableView करने के अलावा अन्य नियंत्रणों के, उस स्थिति में, आप ओवरराइड करना चाहिए अपने viewWillAppear

को
-(void) viewWillAppear:(BOOL)animated{ 
    // Unselect the selected row if any 
    NSIndexPath* selection = [devListTableview indexPathForSelectedRow]; 
    if (selection){ 
     [tableview deselectRowAtIndexPath:selection animated:YES]; 
    } 
} 
11

UITableViewController एक BOOL संपत्ति clearsSelectionOnViewWillAppear कहा जाता है जो करता है आप अपनी ज़रुरत है।

डिफ़ॉल्ट रूप से यह YES पर सेट है, लेकिन मैंने देखा है कि आप (0 बार) गलती से इस संपत्ति को अपने viewWillAppear: विधि को कार्यान्वित करके अक्षम कर सकते हैं। मुझे लगता है कि ऐसा इसलिए है क्योंकि विच्छेदन [UITableViewController viewWillAppear:] के दौरान होता है जो कि अगर आप इसे ओवरराइड करते हैं तो कभी भी कॉल नहीं किया जा सकता है।

समाधान आसान है, तो। बस viewWillAppear: के सुपर के संस्करण फोन है कि विधि के अपने संस्करण में कहीं:

- (void)viewWillAppear:(BOOL)animated { 
    // Your custom code. 
    [super viewWillAppear:animated]; 
} 

एप्पल हमेशा दृश्य की किसी भी सुपर संस्करण बुला सिफारिश {था, विल} {ए, दिसा} ppear तरीकों अगर तुम उन्हें ओवरराइड।

संदर्भ

संबंधित मुद्दे