2008-10-01 9 views
31

एक ऐप में मैं काम कर रहा हूं, मेरे पास एक सादा शैली UITableView है जिसमें शून्य पंक्ति वाले अनुभाग शामिल हो सकते हैं। मैं scrollToRowAtIndexPath का उपयोग करके इस अनुभाग में स्क्रॉल करने में सक्षम होना चाहता हूं: atScrollPosition: एनिमेटेड: लेकिन जब मैं बाल पंक्तियों की कमी के कारण इस अनुभाग में स्क्रॉल करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है।मैं किसी ऐसे अनुभाग में UITableView को कैसे स्क्रॉल करूं जिसमें कोई पंक्ति नहीं है?

ऐप्पल का कैलेंडर एप्लिकेशन ऐसा करने में सक्षम है, यदि आप सूची कैलेंडर में अपना कैलेंडर देखते हैं, और आज के लिए आपके कैलेंडर में कोई ईवेंट नहीं है, तो आज के लिए एक खाली अनुभाग डाला गया है और आप आज का उपयोग करके इसे स्क्रॉल कर सकते हैं स्क्रीन के नीचे टूलबार में बटन। जहां तक ​​मैं ऐप्पल को एक अनुकूलित यूआईटीबल व्यू का उपयोग कर सकता हूं, या वे एक निजी एपीआई का उपयोग कर रहे हैं ...

एकमात्र कामकाज मैं सोच सकता हूं कि एक खाली UITableCell उस 0 पिक्सल ऊंचे में डालना है और स्क्रॉल करना है उस। लेकिन यह मेरी समझ है कि अलग-अलग ऊंचाई की कोशिकाएं स्क्रॉलिंग प्रदर्शन के लिए वास्तव में खराब होती हैं। फिर भी मैं इसे किसी भी तरह से कोशिश करूंगा, शायद प्रदर्शन हिट बहुत खराब नहीं होगी।

अद्यतन

चूंकि इस के लिए कोई समाधान नहीं हो रहा है, मैं सेब के साथ एक बग रिपोर्ट दायर किया है। यह आप भी प्रभावित करता है, तो rdar का डुप्लिकेट फ़ाइल:। // समस्या/6263339 (Open Radar link) आप इस इस तेजी से तय प्राप्त करना चाहते हैं, तो

अद्यतन # 2

मैं इस मुद्दे पर एक सभ्य वैकल्पिक हल है नीचे दिए गए मेरा उत्तर पर एक नज़र डालें।

उत्तर

113

अपडेट: ऐसा लगता है कि यह बग आईओएस 3.0 में तय है। आप 0 पंक्तियों से युक्त एक अनुभाग पर स्क्रॉल करने के लिए निम्न NSIndexPath उपयोग कर सकते हैं:

[NSIndexPath indexPathForRow:NSNotFound inSection:section] 

मैं किसी को अब भी 2.x SDK का उपयोग एक परियोजना को बनाए रखने के लिए यहां अपने मूल वैकल्पिक हल छोड़ देंगे।


मिले एक सभ्य वैकल्पिक हल:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo]; 
[tableView scrollRectToVisible:sectionRect animated:YES]; 

कोड ऊपर tableview स्क्रॉल करेगा ताकि वांछित अनुभाग दिखाई दे रहा है लेकिन जरूरी नहीं कि ऊपर या दृश्य क्षेत्र के तल पर।

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo]; 
sectionRect.size.height = tableView.frame.size.height; 
[tableView scrollRectToVisible:sectionRect animated:YES]; 

संशोधित sectionRect के रूप में नीचे या दृश्य क्षेत्र के बीच में वांछित अनुभाग स्क्रॉल करने के लिए वांछित: आप स्क्रॉल करना चाहते हैं तो अनुभाग शीर्ष पर है यह करते हैं।

+0

[tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 insection: खंड] atScrollPosition: UITableViewScrollPositionTop एनिमेटेड: हाँ]; अधिक आसान है। – Ajumal

+0

@Aju आपकी विधि सेक्शन हेडर पर स्क्रॉल नहीं कर सकती है –

-1

मुझे लगता है कि एक रिक्त पंक्ति शायद वहाँ जाने के लिए एक ही रास्ता है। क्या यह संभव है नया स्वरूप यूआई ऐसी है कि "खाली" पंक्ति कुछ उपयोगी प्रदर्शित कर सकते हैं?

मैं कहता हूं कि इसे आज़माएं, और देखें कि प्रदर्शन कैसा है। वे बहुत सख्त देते हैं अपनी सूची वस्तुओं में पारदर्शी उप-दृश्यों का उपयोग करने के बारे में चेतावनियां, और मुझे नहीं पता कि यह मेरे आवेदन में जितना अधिक है।

4

यह एक पुराना सवाल है, लेकिन ऐप्पल ने अभी भी कुछ भी नहीं जोड़ा है जो क्रैश बग को मदद या ठीक करता है जहां अनुभाग में कोई पंक्ति नहीं है।

मेरे लिए, मैं वास्तव में जब जोड़ा बीच में कोई नया अनुभाग पुस्तक बनाने के लिए आवश्यक है, इसलिए मैं अब इस कोड का उपयोग:

if (rowCount > 0) { 
    [self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: sectionIndexForNewFolder] 
          atScrollPosition: UITableViewScrollPositionMiddle 
            animated: TRUE]; 
} else { 
    CGRect sectionRect = [self.tableView rectForSection: sectionIndexForNewFolder]; 
    // Try to get a full-height rect which is centred on the sectionRect 
    // This produces a very similar effect to UITableViewScrollPositionMiddle. 
    CGFloat extraHeightToAdd = sectionRect.size.height - self.tableView.frame.size.height; 
    sectionRect.origin.y -= extraHeightToAdd * 0.5f; 
    sectionRect.size.height += extraHeightToAdd; 
    [self.tableView scrollRectToVisible:sectionRect animated:YES]; 
} 

आशा है कि आप इसे पसंद है - यह आप के रूप में माइक Akers 'कोड पर आधारित है देख सकते हैं, लेकिन शीर्ष के बजाय बीच में स्क्रॉल करने के लिए गणना करता है। धन्यवाद माइक - आप एक स्टार हैं।

0

एक ही करने के लिए एक स्विफ्ट दृष्टिकोण:

if rows > 0 { 
    let indexPath = IndexPath(row: 0, section: section) 
    self.tableView.setContentOffset(CGPoint.zero, animated: true) 
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true) 
} 

else { 
    let sectionRect : CGRect = tableView.rect(forSection: section) 
    tableView.scrollRectToVisible(sectionRect, animated: true) 
} 
संबंधित मुद्दे