2009-05-22 18 views
45

चयनित रहेंगी कभी-कभी कोशिकाएं छूने के बाद चयनित रहती हैं। क्योंकि यह कभी-कभी होता है, मैं समस्या को पुन: उत्पन्न करने में सक्षम नहीं हूं।आईफोन UITableView कोशिकाएं मेरे UITableView में

कोई संकेत? शायद टेबलव्यू के अनुचित रिलीज के साथ ऐसा कुछ करना है?

- (void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    NSUInteger row = [indexPath row]; 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

switch (row) { 
    case 0: 
     FruitViewController *fruitController = [FruitViewController alloc]; 
     [fruitController retain]; 
     [fruitController initWithNibName:@"FruitView" bundle:[NSBundle mainBundle]]; 
     [self.navigationController pushViewController:fruitController animated:YES]; 
     [fruitController release]; 
     break; 
    case 1: 
     CerealsViewController *cerealsController = [CerealsViewController alloc]; 
     [cerealsController retain]; 
     [cerealsController initWithNibName:@"CerealsView" bundle:[NSBundle mainBundle]]; 
     [self.navigationController pushViewController:cerealsController animated:YES]; 
     [cerealsController release]; 
     break; 
    default: 
     break; 
} 
    } 
+3

शायद तुम viewWillAppear ओवरराइड: बुला बिना एनिमेटेड [सुपर viewWillAppear: एनिमेटेड]? – Tieme

उत्तर

98

क्यों आप इसे ठीक करने के लिए समस्या दिखाई दे रही है, लेकिन यहाँ हैं कुछ सुझाव मैं आपको नहीं बता सकते हैं:

एप्पल एचआईजी के अनुसार, चयन देखने से लौटने तक गायब नहीं करना चाहिए नियंत्रक बस ढेर पर धक्का दिया। यदि आपका नियंत्रक केवल एक UITableViewController है, तो इसे दृश्य पर लौटने पर स्वचालित रूप से अचयनित करना चाहिए। यदि नहीं, तो

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

दृश्य नियंत्रक में कहीं जोड़ें।

कोई पंक्ति, जिसे क्लिक जब चयनित एक और दृश्य के लिए जाना नहीं है, और नहीं वास्तव में कुछ भी करते हो न हो, तो वे नहीं चयन होना चाहिए, ताकि आप

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
में है कि ओवरराइड कर सकते हैं

और उन मामलों में nil वापस करें जिन्हें पंक्ति का चयन नहीं किया जाना चाहिए।

11

बस "एड मार्टी" के जवाब पर विस्तार करने के लिए, मैंने "व्यूविल डिस्प्लेयर" विधि में अचयनित करना चुना क्योंकि मैंने सोचा था कि यह अच्छा दिखता है।

इसके अतिरिक्त मैं नियमित UIViewController (UITableViewController के बजाए) के साथ UITableView का उपयोग कर रहा था, इसलिए tableView चर मेरे लिए उपलब्ध नहीं था। इस पर काबू पाने के लिए मैं मेरे विचार नियंत्रक हेडर फाइल में एक tableView संपत्ति जोड़ा (और मेरी XIB फ़ाइल में मैं संपत्ति के वास्तविक तालिका दृश्य जुड़े) ...

@property (nonatomic,retain) IBOutlet UITableView *tableView 

... और देखने नियंत्रक कार्यान्वयन वायर्ड में संपत्ति और अचयनित प्रदर्शन के रूप में इस ..

@synthesize tableView 

- (void) viewWillDisappear:(BOOL)animated { 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated]; 
    [super viewWillDisappear:animated]; 
} 
+0

धन्यवाद, आईबीओलेट जानकारी ने मेरी मदद की। –

+0

यह समाधान सबसे अच्छा है क्योंकि चयनित उत्तर नेविगेशन नियंत्रक – codingrhythm

21

एक संभावित कारण एक नियंत्रक कि UITableViewController फैली में [super viewWillAppear] बुला बिना -viewWillAppear:animated: अधिभावी है। [super viewWillAppear:animated] को -viewWillAppear विधि की शुरुआत में जोड़ना समस्या को ठीक कर सकता है।

+0

में काम नहीं करता है यह मेरे लिए था, धन्यवाद! –

+0

दोह! मुझे यह पता था, लेकिन अनुस्मारक के लिए धन्यवाद। –

8

आप एक UITableViewController का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं:

self.clearsSelectionOnViewWillAppear = YES; 
+0

मैं इसे कहां रख सकता हूं? –

+0

इसे अपने दृश्य पर आज़माएं DidLoad या ViewWillAppear @GajendraKChauhan – Pach

+0

ऐप्स के बीच स्विच करते समय काम नहीं करता है। –

4

मेरे मामले में, मैं सही didSelectRowAtIndexPath के अंत में सेल का चयन रद्द:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    // Do smth here. segue ..etc 

    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO]; 
} 
0

अपने UITableViewCell कक्षा में इस विधि का प्रयोग करें

(void)setSelected:(BOOL)selected animated:(BOOL)animated { 

// Just comment This line of code 

// [super setSelected:selected animated:animated]; 

} 

या यहां तक ​​कि आप इस कोड को भी किया जा सकता है SelectRowAtIndexPath मेथो घ

- (शून्य) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {

// कुछ सामान जब पंक्तियां चुनी जाती हैं क्या

[tableView deselectRowAtIndexPath:indexPath animated:YES]; 

}

0

एक बार जब आप सीखते हैं कि तालिकाओं को कैसे प्रबंधित किया जाता है, तो इसे हल करने में लगभग दो सेकंड लगते हैं।

जैसे ही कोशिकाओं स्क्रीन बंद स्क्रॉल कर रहे हैं के रूप में, वे अपने स्वरूपण खो देते हैं। तालिका अन्य कोशिकाओं को खारिज करके और उपयोगकर्ता को वापस स्क्रॉल करते समय पुन: प्रयास करके इसके स्मृति उपयोग को कम करती है।

यहां तक ​​कि तालिका डेटा, जो वास्तव में केवल उस पल में स्क्रीन पर कोशिकाओं पर लागू होता है फिर से लोड करने की तरह बातें। प्वाइंट होने के कारण, सेलफॉररोएट इंडेक्सपैथ उपयोगकर्ता को बटन दबाकर या व्यू कंट्रोलर छोड़ने के बिना पांच बार एक ही सेल बना सकता है! तो इसे किसी भी स्वरूपण को पुनः लोड करने के लिए सेट करें। cellForRowAtIndexPath को कुछ इस तरह करें:

if arrayOf_SelectedCells.contains(indexPath) { 
     setup_Selected(cell) 
     //Where setup_Selected is a custom function to apply formatt 
    } else { 
     setup_Unselected(cell) 
    }