2010-05-28 14 views
9

किसी तालिका के साथ एक दृश्य स्क्रीन पर धक्का दिया जाता है और मैं स्क्रीन को वास्तव में प्रदर्शित होने से पहले तालिका में किसी निश्चित पंक्ति पर स्क्रॉल करना चाहता हूं। मैं अंतिम कोड नियंत्रक के भीतर इस कोड का उपयोग करता हूं।शो से पहले तालिका में पंक्ति में तुरंत स्क्रॉल करें

NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
[theTable scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

जब मैंने इसे viewDiDAppear विधि में डाल, तो यह कुछ समय के लिए आरंभिक (शीर्ष पर) तालिका के स्थिति से पंक्ति मैं चाहता हूँ करने के लिए पाती है। मैं नहीं चाहता कि यह प्रारंभिक स्थिति दिखाए। अगर मैं इसे डीडलोड या व्यूविलपियर में देखता हूं तो यह एनएसआरेंज एक्सेप्शन के साथ दुर्घटनाग्रस्त हो जाता है, संभवतः क्योंकि तालिका अभी तक सेट नहीं है।

प्रारंभिक स्थिति को दिखाए बिना स्क्रॉल करने के लिए मैं इसे कैसे प्राप्त करूं?

+1

[यह] (http://stackoverflow.com/questions/2289114/make-uitableview-selection-before-view-appears/2289812#2289812) और [इस] (http: // stackoverflow। कॉम/प्रश्न/2156614/कैसे-से-शुरू-uitableview-on-the-last-cell) मदद कर सकता है। – DyingCactus

उत्तर

13

शैगी के लिए धन्यवाद और मुझे सही दिशा में इशारा करते हुए के लिए कैक्टस मरने। नीचे दिए गए

-(void)viewWillAppear:(BOOL)animated 
{ 
    [theTable reloadData]; 
    NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
    [theTable scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 
+1

अपने स्वयं के उत्तर को स्वीकार करने के लिए सुनिश्चित करें ताकि इस प्रश्न को पढ़ने वाले अन्य लोग इसे एक नज़र में देख सकें :) – BoltClock

+0

यह मेरी आवश्यकता के लिए बहुत अच्छा है। केवल एक चीज जो मैंने अलग की थी, मैंने स्क्रॉलपॉशनटॉप के बजाय UITableViewScrollPositionNone का उपयोग किया था ताकि उपयोगकर्ता जितनी संभव हो सके चयनित पंक्ति के ऊपर की अधिकांश तालिका देख सकें। – RanLearns

+1

यह मेरे लिए काम नहीं करता है क्योंकि आईओएस (5 और 6) के नए संस्करणों पर मैं ओएस द्वारा सेट किए जाने वाले फ्रेम को तब तक नहीं देख रहा हूं जब तक विल्लएपियर नहीं। viewWillLayoutSubviews/viewDidLayoutSubviews को देखने के बाद तक कॉल नहीं किया जाता है DidAppear। – Logachu

2

अगर मैं viewDidLoad या viewWillAppear में रख तो यह एक NSRangeException साथ दुर्घटनाओं, क्योंकि शायद तालिका अभी तक सेट नहीं किया गया है।

तालिका अभी तक क्यों स्थापित नहीं है? आप किस विधि में इसे स्थापित कर रहे हैं?

+0

अच्छी तरह से यह cellforrowatindexpath – cannyboy

+1

में बनाया गया है आप तालिका को लोड कर सकते हैं WillAppear –

1

मैंने अभी इसके साथ कुश्ती समाप्त की है। मेरा सूची में शीर्ष पर एक खोज बार जोड़ रहा था, शुरुआत में शीर्ष पर टकरा गया था ... कुछ मूल ऐप्स के अलावा। मैं वास्तव में एक ही सवाल पूछने जा रहा था!

मुझे यह पेशकश करने का डर है, क्योंकि ऐसा लगता है कि चीजें प्रदान करने वाले लोग नीचे चढ़ गए हैं ... लेकिन ... मुझे आश्चर्य हुआ कि कोई आसान समाधान नहीं था ... इसलिए मैंने यह कर लिया:

मैं कस्टम खींची गई कोशिकाओं (अच्छा और तेज़!) के लिए ABTableViewCell (आप इसे Google कर सकते हैं) का उपयोग करते हैं, और जब मुझे दूसरी पंक्ति को ड्रॉ करने के लिए बुलाया जाता है (आप इसे अपने कस्टम रूप से खींचे गए सेल में ABTableViewCell के बिना कर सकते हैं), मैंने इसे वहां सेट किया , एक भी आग सेमाफोर साथ:

if (self.mOnlyOnce == NO && theRow > 1) { 
    self.mOnlyOnce = YES; 
    [self.mParentTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 

(अपने उचित पंक्ति/अनुभाग का चयन, सूट के रूप में आप ... अगर वे एक ही अनुभाग में थे, तो आप शायद पंक्ति कुछ के लिए सेटिंग होगी 0 के अलावा)

यदि आप मेरे समाधान से नफरत करते हैं (जैसा कि मैं अभी तक टिप्पणी नहीं कर सकता), तो कृपया मुझे शून्य & पर छोड़ने का पक्ष दें ताकि बेहतर समाधान शीर्ष पर आ सके।

ओह, भी, शीर्ष पर अपनी खोज छिपाने के बारे में एक प्रविष्टि है ... लेकिन मेरा पहले से ही एक कस्टम सेल के रूप में किया गया था ... यहां link है।

का आनंद

-1
iOS 8 में

और [self.tableView reloadData] ऊपर viewWillAppearscrollToRowAtIndexPath से पहले में काम नहीं करता है, तो आप viewDidAppear में फिर से लोड करना है: जवाब viewWillAppear में मेज और स्क्रॉल लोड करने के लिए है

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:YES]; 

    [self.tableView reloadData]; 

    [self.tableView scrollToRowAtIndexPath:[[NSIndexPath indexPathForRow:18 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

} 

नोट: आपको UITableViewScrollPositionTop का उपयोग करना होगा, अन्यथा स्क्रॉलिंग अपेक्षित नहीं होगी और अंतिम पंक्ति के बाद scrollToRow निर्दिष्ट करते समय अंतिम पंक्ति के बाद भी नीचे तक स्क्रॉल कर सकते हैं।

मुझे लगता है कि आईओएस 8 में और पहली बार तालिका दृश्य लोड हो गया है, यह तालिका बनाने के लिए उपयोग किए गए सभी डेटा लोड नहीं करता है, यही कारण है कि आपको [tableView reload] का उपयोग करना है जो मुझे लगता है कि थोड़ा अजीब है।

2

scrollToRowAtIndexPath:viewWillAppear: में कॉलिंग मेरे लिए काम नहीं करती है क्योंकि tableView अभी तक लोड नहीं हुआ है। लेकिन मैं कुछ देरी के बाद scrollToRowAtIndexPath: पर कॉल करने के साथ इसे हल कर सकता हूं।

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    [self performSelector:@selector(scrollToCell) withObject:nil afterDelay:0.1]; 
} 

- (void) scrollToCell 
{ 
    [_tableView reloadData]; 
    NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
    [_tableView scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 

आशा है कि इससे किसी की मदद मिलेगी।

+2

यह उत्तर बेहतर काम करता है लेकिन आप इसके बजाय dispatch_after भी उपयोग कर सकते हैं। – harshalb

+0

आईओएस 8 पर कई चीजों की कोशिश की और केवल यह काम करता है। लेकिन मुख्य धागे पर 'dispatch_async' के साथ भी काम करता है। –

+0

0 की देरी भी ठीक काम करती है, और 100ms से बेहतर दिखती है जहां आप टेबल को धक्का देने के बाद भी 100ms कूदेंगे –

1

आप इस व्यवहार को प्राप्त करने के लिए viewDidLoad में मुख्य रन लूप के अगले पुनरावृत्ति में स्क्रॉल को प्रेषित करने के लिए जीसीडी का उपयोग कर सकते हैं। स्क्रॉल स्क्रीन पर दिखाए जाने से पहले स्क्रॉल किया जाएगा, इसलिए कोई चमक नहीं होगी।

- (void)viewDidLoad { 
    dispatch_async (dispatch_get_main_queue(), ^{ 
     NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH; 
     [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
    }]; 
} 
4

मैं ठीक उसी समस्या थी, सब कुछ कोशिश कर के बाद, इस काम किया, कुंजी आप autolayout उपयोग कर रहे हैं है, तो आप

सत्य पर scrollToBottom प्रारंभ और फिर ऐसा करने viewDidLayoutSubviews

में scrollToBottom कोड लिखना चाहिए

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    // Scroll table view to the last row 
    [self scrollToBottom]; 
} 

-(void)scrollToBottom { 
    if (shouldScrollToLastRow) 
    { 
     CGPoint bottomOffset = CGPointMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height); 
     [self.tableView setContentOffset:bottomOffset animated:NO]; 
    } } 

ऐसा करने से यह सुनिश्चित होगा कि आप आप के तल पर लगभग समाप्त हो गई हो tableView लेकिन सटीक नीचे पता करने के लिए ऑफसेट जब आप tableView के शीर्ष पर रहे हैं इसकी असंभव के रूप में बहुत नीचे स्थित नहीं हो सकता है , उसके बाद हम स्क्रो को कार्यान्वित कर सकते हैं llViewDidScroll

-(void)scrollViewDidScroll: (UIScrollView*)scrollView 
{ 
    float scrollViewHeight = scrollView.frame.size.height; 
    float scrollContentSizeHeight = scrollView.contentSize.height; 
    float scrollOffset = scrollView.contentOffset.y; 

    // if you're not at bottom then scroll to bottom 
    if (!(scrollOffset + scrollViewHeight == scrollContentSizeHeight)) 
    { 
     [self scrollToBottom]; 
    } else { 
    // bottom reached now stop scrolling 
     shouldScrollToLastRow = false; 
    } 
} 
संबंधित मुद्दे