2009-09-26 11 views
19

मैं अपनी तालिका दृश्य को अंतिम स्थिति याद रखने की कोशिश कर रहा हूं, ताकि ऐप फिर से चलने के बाद, यह उस स्थिति तक स्क्रॉल हो जाएगा। ऐसा करने के लिए, मेरे viewWillDisappear: विधि में, मुझे पहली बार दिखाई देने वाली पंक्ति संख्या मिलती है और इसे NSUserDefaults पर सहेजती है। फिर मेरे विचार में DidAppear मैं तालिका दृश्य में scrollToRowAtIndexPath भेज कर उस पंक्ति पर स्क्रॉल करने का प्रयास करता हूं।UITableView scrollToRowAtIndexPath

*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]: section (0) beyond bounds (0).

किसी भी मदद की सराहना की: हालांकि मैं एक NSRangeException मिलता है। यहां कोड है:

- (void)viewDidAppear:(BOOL)animated 
{ 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

    if ([userDefaults valueForKey:@"content_row"] != nil) 
    { 
     int rowToHighlight = [[userDefaults valueForKey:@"content_row"] intValue]; 
     NSIndexPath * ndxPath= [NSIndexPath indexPathForRow:rowToHighlight inSection:0]; 
     [contentTableView scrollToRowAtIndexPath:ndxPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
    } 
} 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    NSIndexPath *selectedRowPath = [[contentTableView indexPathsForVisibleRows] objectAtIndex:0]; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setInteger:selectedRowPath.row forKey:@"content_row"]; 
} 
+0

क्या आप कोड के बिट को पोस्ट कर सकते हैं जो scrollToRowAtIndexPath और NSIndexPath निर्माण करता है? – probablyCorey

उत्तर

52

scrollToRowAtIndexPath कॉल करने से पहले तालिका दृश्य डेटा को दोबारा लोड करें।

[contentTableView reloadData]; 
+4

यह तब तक काम नहीं करता है जब डेटा अभी तक लोड नहीं होता है (एक प्राप्त परिणाम नियंत्रक का उपयोग करके)। मेरा समाधान 'tableView.numberOfRowsInSection (0)> 0' पहले जांचना था। – SimplGy

+0

या यदि एक अलग धागे पर है, तो इसे आजमाएं। '[tblView प्रदर्शन चयनकर्ताऑनमेन थ्रेड: @ चयनकर्ता (पुनः लोडडाटा) ऑब्जेक्ट के साथ: शून्य प्रतीक्षा करें नहीं: हाँ]' – matrixugly

8

यह संभव है कि सामग्रीTableView ने अभी तक डेटा लोड करना समाप्त नहीं किया है।

+1

इसे समाप्त होने पर मुझे अधिसूचित कैसे किया जा सकता है? –

+2

क्षमा करें, मैंने सोचा था कि scrollToRowAtIndexPath कोDidLoad में बुलाया जा रहा था। मेरे पासDidAppear देखने में समान कॉल हैं लेकिन सहेजी गई पंक्ति संख्या पर लौटने की बजाय, मैं एक सहेजे गए कुंजी मान पर वापस लौटाता हूं जो किया गया है SlectRowAtIndexPath। ScrollToRowAtIndexPath को कॉल करने से पहले, मुझे वर्तमान में लोड किए गए डेटा स्रोत में उस कुंजी मान की पंक्ति मिलती है। – DyingCactus

+0

मीठा! यह वास्तव में मेरे गियर्स सही दिशा में कताई पाने में मदद की। मैंने एक अलग जवाब में विस्तार से बताया। – matrixugly

0

मैं मरिंग कैक्टस के उत्तर पर विस्तृत करना चाहता हूं। मैं एक सुंदर नए iOS डेवलपर हूं और मेरी स्थिति थोड़ा अलग था, लेकिन जैसा कि उन्होंने कहा

जबकि जवाब "ऐसा नहीं है कि contentTableView अभी तक समाप्त नहीं लोड हो रहा है डेटा है संभव है" संक्षेप में, यह मेरे पहियों को मोड़ गया और यह मेरे लिए क्या हो रहा था।

मेरे सेटअप

  • UITableView ViewController पर है 'ए'
  • मेरे ऐप्स नए ViewController "बी"
  • एक बटन क्लिक किया जाता है ViewController 'बी' पर, तो डेटा जोड़ा जाता है प्रस्तुत करता है UITableView के डेटा स्रोत के लिए।
  • बी के बटन पर क्लिक हैंडलर से, [tableView reloadData] कहा जाता है
  • बी के बटन पर क्लिक हैंडलर से, [tableView selectRowAtIndexPath:idxPath animated:false scrollPosition:UITableViewScrollPositionTop]; कहा जाता है
  • ViewController 'बी' को खारिज कर दिया जाता है और 'ए' फिर से प्रस्तुत किया जाता है (दिखा अद्यतन UITableView)

समाधान

  • पहली समस्या मैं ठीक करने के लिए किया थाकहते थेजैसे मुख्य धागे पर

    [tblView प्रदर्शन चयनकर्ताऑनमेन थ्रेड: @ चयनकर्ता (पुनः लोडडेटा) ऑब्जेक्ट: शून्य प्रतीक्षा करें नहीं: गलत];

  • अंतिम समस्या waitUntilDone से सच (डीयूएच!)

हाँ, मेरे लिए इतनी स्पष्ट रूप से, contentTableView डेटा लोड हो रहा क्योंकि मेरे reloadData कॉल जो मुख्य थ्रेड पर चलाया जा रहा है स्पष्ट रूप से ब्लॉक करने के लिए जब तक चयनकर्ता किया गया था सेट नहीं था नहीं किया गया था।

उम्मीद है कि यह किसी की मदद करेगा।