2010-07-24 23 views
48

क्या कोई तरीका यह जानने का कोई तरीका है कि कोई तालिकादृश्य कक्ष वर्तमान में दिखाई दे रहा है या नहीं? मेरे पास एक टेबलव्यू है जिसका पहला सेल (0) एक यूआईसर्चबार है। यदि कोई खोज सक्रिय नहीं है, तो ऑफ़सेट के माध्यम से सेल 0 छुपाएं। जब तालिका में केवल कुछ पंक्तियां होती हैं, तो पंक्ति 0 दिखाई दे रही है। यह निर्धारित करने के लिए कि पंक्ति 0 दिखाई दे रहा है या शीर्ष पंक्ति है या नहीं?निर्धारित करें कि कोई टेबलव्यू सेल दिखाई दे रहा है

उत्तर

93

UITableViewindexPathsForVisibleRows कहा जाता है एक उदाहरण विधि है कि तालिका जो वर्तमान में दिखाई दे रहे हैं में प्रत्येक पंक्ति के लिए एक NSIndexPath की NSArray वस्तुओं वापस आ जाएगी है। आप इस विधि को किसी भी आवृत्ति के साथ जांच सकते हैं और उचित पंक्ति की जांच कर सकते हैं।

-(BOOL)isRowZeroVisible { 
    NSArray *indexes = [tableView indexPathsForVisibleRows]; 
    for (NSIndexPath *index in indexes) { 
    if (index.row == 0) { 
     return YES; 
    } 
    } 

    return NO; 
} 

क्योंकि UITableView विधि NSIndexPath देता है, आप बस के रूप में आसानी से इस का विस्तार कर सकते हैं: उदाहरण के लिए, यदि tableView अपनी मेज के लिए एक संदर्भ है, निम्न विधि आपको बता होगा या नहीं, पंक्ति 0 स्क्रीन पर है खंड, या पंक्ति/खंड संयोजन के लिए देखो।

यह visibleCells विधि से अधिक उपयोगी है, जो तालिका सेल ऑब्जेक्ट्स की एक सरणी देता है। टेबल सेल ऑब्जेक्ट्स को पुनर्नवीनीकरण मिलता है, इसलिए बड़ी तालिकाओं में अंततः आपके डेटा स्रोत पर कोई सरल सहसंबंध नहीं होगा।

+0

धन्यवाद! यह बहुत उपयोगी था, लेकिन यह "indexPathsForVisibleRows" नहीं होना चाहिए "indexPathsForvisibleRows" – mklfarha

+0

इस उत्तर के लिए धन्यवाद। सितार गुम है। "के लिए (इंडेक्स में एनएसआईएनएक्सएक्सपीएटी * इंडेक्स) {" –

+4

@ डेवुनवायर मेरे पास एक फॉलोअप प्रश्न है। क्या होगा यदि मैं जांचना चाहता हूं कि कोई पंक्ति ** पूरी तरह ** दिखाई दे रही है या नहीं। आपका कोड ठीक है सिवाय इसके कि यदि यह पंक्ति केवल आंशिक रूप से दिखाई दे तो यस भी वापस कर दें। धन्यवाद! – pixelfreak

1

आईओएस 4:

NSArray *cellsVisible = [tableView indexPathsForVisibleRows]; 
NSUInteger idx = NSNotFound; 
idx = [cellsVisible indexOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) 
{ 
    return ([(NSIndexPath *)obj compare:indexPath] == NSOrderedSame); 
}]; 

if (idx == NSNotFound) 
{ 
35

करने के लिए tableview सेल जाँच दिख रहा है या लाइन के लिए इस कोड

if(![tableView.indexPathsForVisibleRows containsObject:newIndexPath]) 
    { 
     // your code 
    } 

यहाँ newIndexPath जाँच सेल के IndexPath है ..... का उपयोग नहीं

स्विफ्ट 3.0

if !(tableView.indexPathsForVisibleRows?.contains(newIndexPath)) { 
    // Your code here 

} 
+0

मुझे चैट पर गिनती बरकरार रखने का आपका जवाब मिला धन्यवाद ... मैंने यहां एक ही सवाल पूछा http://stackoverflow.com/questions/12990128/what-is-ios-retain-do-at-backend लेकिन मुझे नकारात्मक अंक मिल गए .. :(भी, +1 के लिए यह .. –

4

एक और समाधान (जिसे यह भी जांचने के लिए इस्तेमाल किया जा सकता है कि कोई पंक्ति पूरी तरह से दिखाई दे रही है) यह जांचना होगा कि row के लिए फ्रेम tableview के दृश्यमान भाग के अंदर है या नहीं।

निम्न कोड में, ip का प्रतिनिधित्व करता है NSIndexPath:

CGRect cellFrame = [tableView rectForRowAtIndexPath:ip]; 
if (cellFrame.origin.y<tableView.contentOffset.y) { // the row is above visible rect 
    [tableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 
else if(cellFrame.origin.y+cellFrame.size.height>tableView.contentOffset.y+tableView.frame.size.height-tableView.contentInset.top-tableView.contentInset.bottom){ // the row is below visible rect 
    [tableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionBottom animated:NO]; 
} 

इसके अलावा cellForRowAtIndexPath: का उपयोग कर काम करना चाहिए, क्योंकि यह एक nil ऑब्जेक्ट यदि पंक्ति दिखाई नहीं देता है:

if([tableView cellForRowAtIndexPath:ip]==nil){ 
    // row is not visible 
} 
4

स्विफ्ट संस्करण:

if let indices = tableView.indexPathsForVisibleRows { 
    for index in indices { 
     if index.row == 0 { 
      return true 
     } 
    } 
} 
return false 
7

मैं उपयोग करता हूं स्विफ्ट 3.0

extension UITableView { 

    /// Check if cell at the specific section and row is visible 
    /// - Parameters: 
    /// - section: an Int reprenseting a UITableView section 
    /// - row: and Int representing a UITableView row 
    /// - Returns: True if cell at section and row is visible, False otherwise 
    func isCellVisible(section:Int, row: Int) -> Bool { 
     guard let indexes = self.indexPathsForVisibleRows else { 
      return false 
     } 
     return indexes.contains {$0.section == section && $0.row == row } 
    } } 
+0

शानदार सामान! – Fattie

0

ध्यान दें कि "कुछ हद तक दृश्यमान" दृश्यमान है। इसके अलावा, व्यूविल्लियर में, आपको indexPathsForVisibleRows से झूठी सकारात्मकता मिल सकती है क्योंकि लेआउट प्रगति पर है, और यदि आप अंतिम पंक्ति को देख रहे हैं, तो layoutIfNeeded() पर कॉल करने से आपको टेबल के लिए मदद नहीं मिलेगी। आप viewDidAppear में/बाद में चीजों की जांच करना चाहेंगे।

यह स्विफ्ट 3.1 कोड अंतिम पंक्ति पूरी तरह से दिखाई देने पर स्क्रॉल अक्षम कर देगा। इसे DidAppear में/बाद में कॉल करें।

let numRows = tableView.numberOfRows(inSection: 0) // this can't be in viewWillAppear because the table's frame isn't set to proper height even after layoutIfNeeded() 
    let lastRowRect = tableView.rectForRow(at: IndexPath.init(row: numRows-1, section: 0)) 
    if lastRowRect.origin.y + lastRowRect.size.height > tableView.frame.size.height { 
     tableView.isScrollEnabled = true 
    } else { 
     tableView.isScrollEnabled = false 
    } 
संबंधित मुद्दे