2010-04-21 26 views
7

मैं आईफोन एसडीके 3.1.3 का उपयोग कर रहा हूं। मेरे पास UITableViewController है जो किसी अन्य नियंत्रक से डेटा प्राप्त करता है। तालिका दृश्य मुख्यदृश्य के उप-दृश्य के रूप में जोड़ा गया है लेकिन फ्रेम सेट है ताकि यह दिखाई न दे। तालिका दृश्य फ्रेम को अद्यतन किया जाता है और बटन पर टैप करके मुख्य दृश्य पर स्लाइड करने के लिए बनाया जाता है।UITableView विशिष्ट स्थिति पर स्क्रॉलिंग

तालिका दृश्य प्रकट होता है और मैं अंतिम पंक्ति तक स्क्रॉल करता हूं। अगर मैं अंतिम पंक्ति का चयन करता हूं, तो मैं अधिक डेटा के साथ तालिका को पुनः लोड करता हूं। तालिका अधिक डेटा के साथ अद्यतन हो जाता है। स्क्रॉल स्थिति हमेशा शीर्ष पर छोड़कर सब कुछ ठीक काम करता है।

मुझे स्क्रॉल स्थिति की आखिरी पंक्ति होने की आवश्यकता है जिसे मैंने अधिक डेटा लोड करने के लिए क्लिक किया था। मैं स्क्रॉल स्थिति को सहेजता हूं और अधिक डेटा लोड करने के बाद निम्न कोड को कॉल करता हूं। यह बिना किसी समस्या के निष्पादित करता है लेकिन स्क्रॉल स्थिति हमेशा शीर्ष पर होती है।

[theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:savedScrollPosition animated:NO]; 

उपरोक्त का कोई प्रभाव नहीं पड़ता है। ViewWillAppear:ViewDidAppear: आग नहीं है और मुझे बताया गया है कि अगर दृश्य नियंत्रक कोड में तत्काल है, तो यह मामला है, ये आग नहीं है। तालिका को फिर से लोड करने के बाद स्क्रॉल स्थिति को कैसे और कब सेट करना है, यह जानने में मेरी सहायता करें ([theTableView reloadData]) ताकि यह उस पंक्ति पर है जिस पर मैंने क्लिक किया था।

कोड तालिका दृश्य को फिर से लोड करने के लिए & स्क्रॉल

////performAction will notify the tableviewcontroller which will result in didPerformAction being called 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == lastRow) 
    { 
     savedScrollPosition = lastRow; 
     //perform the action 
     [controller performAction]; 
    } 
} 

- (void) didPerformAction:(NSNotification *)obj 
{ 
    [theTableView reloadData]; 
    [theTableView 
    scrollToRowAtIndexPath: [NSIndexPath indexPathForRow:savedScrollPosition inSection:0] 
    atScrollPosition:UITableViewScrollPositionBottom 
    animated:NO]; 
} 

उत्तर

28

यह चाल करने के लिए लग रहा था।

[theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
CGPoint point = theTableView.contentOffset; 
point .y -= theTableView.rowHeight; 
theTableView.contentOffset = point; 
+2

बचाया गया है इस कथन में स्क्रॉलपॉजिशन –

0

हैं कि वास्तविक कोड है और यह मानते हुए theTableView वहाँ शून्य नहीं है, तो आपको एक चेतावनी है कि "करने के लिए ... जवाब नहीं हो सकता है" क्योंकि scrollToRowAtIndexPath है हो रही किया जाना चाहिए गलत वर्तनी

दूसरा, atScrollPosition पैरामीटर UITableViewScrollPosition enum मान से अपेक्षा करता है कि स्क्रीन पर जहां आप लक्ष्य पंक्ति को स्थानांतरित करना चाहते हैं।

इस प्रयास करें:

[theTableView scrollToRowAtIndexPath: 
       [NSIndexPath indexPathForRow:savedScrollPosition inSection:0] 
       atScrollPosition:UITableViewScrollPositionBottom 
       animated:NO]; 
+0

क्षमा करें कि एक टाइपो था। मैंने इसे संपादित किया है। अच्छी तरह से, मैं नीचे स्क्रॉल नहीं करना चाहता हूं। मुझे उस पंक्ति पर स्क्रॉल करने की ज़रूरत है जिस पर मैंने क्लिक किया था, जिस पर मध्य है लेकिन मध्य में नहीं। फिर भी, मैंने कोशिश की और अजीब बात यह है कि यह अभी भी शीर्ष पर रहता है। – Dave

+0

वह विधि दिखाएं जहां इसे कहा जाता है। सहेजे गए स्क्रॉलपोजिशन के मूल्य को दिखाने वाले कॉल से पहले NSLogs को रखें। atScrollPosition पंक्ति संख्या का संदर्भ नहीं देता है लेकिन स्क्रीन पर इसकी वर्तमान सापेक्ष स्थिति में है। – DyingCactus

+0

ओह मैं देखता हूँ। मैंने कोड अपडेट किया। – Dave

10

यह बेहतर दिखेगा और आप reloadData कॉल करने के बजाय पंक्तियाँ सम्मिलित कर सकते हैं, तो पुस्तक स्थिति तय रहेगी।

[theTableView beginUpdates]; 
[theTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
// make sure the dataSource will return new rows before calling endUpdates 
[theTableView endUpdates]; 
इसके बजाय स्क्रॉल आप स्क्रॉल UIScrollView उपयोग कर सकते हैं UITableView का उपयोग करने का

:

savedOffset = [theTableView contentOffset]; 

फिर बहाल:

[theTableView setContentOffset:savedOffset]; 
+0

ओह धन्यवाद, मैंने अभी उत्तर पोस्ट किया है जो आपके जैसा ही है, सामग्री सेट अप ऑफ़सेट। अपनी सम्मिलित पंक्ति युक्ति के लिए धन्यवाद। – Dave

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