दिलचस्प पोस्ट
एक स्थैतिक आरंभीकरण ब्लॉक में एक योग्य स्थिर अंतिम चर की अनुमति क्यों नहीं है? हूओप स्कीम के लिए कोई फ़ाइल सिस्टम: फ़ाइल बैच फ़ाइल को एक फ़ोल्डर से दूसरे फ़ोल्डर में फाइल कॉपी करने के लिए विंडोज 7 में दोनों पायथन 2. एक्स और पायथन 3.x को कैसे स्थापित करें क्या सी + + में मूल्य से गुजारें या निरंतर संदर्भ से उत्तीर्ण हो? एक समझदार, सुरक्षित और कुशल तरीके से एक फ़ाइल की प्रतिलिपि बनाएँ Whatsapp से सभी संदेश प्राप्त करें ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में "इंटरफ़ेस" की परिभाषा क्या है कैसे std :: vector को आकार घटाने के लिए? Socket.io के साथ PHP का उपयोग करना WPF blurry फोंट मुद्दा- समाधान ASP.NET अनुप्रयोग के HTML आउटपुट को न्यूनतम करें पोर्ट अग्रेषण के बिना स्काइप कैसे काम करता है? निर्धारित करना है कि यदि कोई iPhone जेल टू प्रोग्रामेटिक रूप से है यूएमएल तीरों का स्पष्टीकरण

UITableView अनंत स्क्रॉलिंग

मैं UITableView में एक अनंत स्क्रॉलिंग कैसे करूं? मुझे पता है कि यह UIScrollView का उपयोग करके कैसे करें, जिसमें से एप्पल ने WWDC के वीडियो में से एक में प्रदर्शित किया है मैंने tableView:cellForRowAtIndexPath: में निम्नलिखित करने की कोशिश की tableView:cellForRowAtIndexPath: ::

 if (indexPath.row == [self.newsFeedData_ count] - 1) { [self.newsFeedData_ addObjectsFromArray:self.newsFeedData_]; [self.tableView reloadData]; } 

लेकिन यह विफल रहता है। कोई अन्य विचार?

वेब के समाधान से एकत्रित समाधान "UITableView अनंत स्क्रॉलिंग"

यदि आपको UITableView के निचले भाग में जाने पर आपको पता होना चाहिए, तो यह प्रतिनिधि है (क्योंकि यह UIScrollView का उपवर्ग है), और -scrollViewDidScroll का उपयोग करें: टेबल की सामग्री ऊंचाई की तुलना करने के लिए प्रतिनिधि विधि और यह वास्तविक स्क्रॉल स्थिति है।

संपादित करें (ऐसा कुछ):

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView_ { CGFloat actualPosition = scrollView_.contentOffset.y; CGFloat contentHeight = scrollView_.contentSize.height - (someArbitraryNumber); if (actualPosition >= contentHeight) { [self.newsFeedData_ addObjectsFromArray:self.newsFeedData_]; [self.tableView reloadData]; } } 

आप शीर्ष पर ताज़ा करने के लिए पुल के साथ अनंत स्क्रॉल का समर्थन कर सकते हैं और / या स्पिनर व्हील के साथ लगातार नीचे स्क्रॉल कर सकते हैं:

https://github.com/samvermette/SVPullToRefresh

SVPullToRefresh तर्क को संभालता है जब UITableView नीचे तक पहुंचता है। एक स्पिनर स्वचालित रूप से दिखाया जाता है और एक कॉलबैक ब्लॉक निकाल दिया जाता है। आप अपने व्यवसाय तर्क में कॉलबैक ब्लॉक में जोड़ते हैं।

यहां एक उदाहरण है:

 #import "UIScrollView+SVInfiniteScrolling.h" // ... [tableView addInfiniteScrollingWithActionHandler:^{ // append data to data source, insert new cells at the end of table view // call [tableView.infiniteScrollingView stopAnimating] when done }]; 

इस प्रोजेक्ट को कोकाओपोड्स का उपयोग करके या सीधे आपकी परियोजना में संकलित किया जा सकता है।

यहां एक अनन्त स्क्रॉलिंग यूआईटेबल वीव का एक बहुत ही त्वरित और पूर्ण डेमो है जिसे मैंने एक साथ रखा …

 @interface InfiniteScrollViewController () @property (nonatomic) NSMutableArray *tableViewData; @property (nonatomic) BOOL loadingMoreTableViewData; @end @implementation InfiniteScrollViewController - (void)viewDidLoad { self.tableViewData = [[NSMutableArray alloc] init]; [self addSomeMoreEntriesToTableView]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.tableViewData.count + 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } if (indexPath.row < self.tableViewData.count) { cell.textLabel.text = [self.tableViewData objectAtIndex:indexPath.row]; } else { cell.textLabel.text = @"Loading more data..."; // User has scrolled to the bottom of the list of available data so simulate loading some more if we aren't already if (!self.loadingMoreTableViewData) { self.loadingMoreTableViewData = YES; [self performSelector:@selector(addSomeMoreEntriesToTableView) withObject:nil afterDelay:5.0f]; } } return cell; } - (void)addSomeMoreEntriesToTableView { int loopTill = self.tableViewData.count + 20; while (self.tableViewData.count < loopTill) { [self.tableViewData addObject:[NSString stringWithFormat:@"%i", self.tableViewData.count]]; }; self.loadingMoreTableViewData = NO; [self.tableView reloadData]; } @end 

'UITableView' 'scrollViewDidScroll' विधि में 'UIScrollView' के समान है।

इसलिए, अनंत स्क्रॉलिंग का अनुकरण करना आसान है।

  1. सरणी को दोगुना करें ताकि सिर और पूंछ परिपत्र तालिका का अनुकरण करने के लिए एक साथ जुड़ जाए

  2. दोगुना तालिका के 1 भाग और दोहरी तालिका के दूसरे भाग के बीच उपयोगकर्ता स्विच करने के लिए मेरा निम्नलिखित कोड का उपयोग करें जब वे तालिका के शुरू या अंत तक पहुंचने के लिए करते हैं

:

 /* To emulate infinite scrolling... The table data was doubled to join the head and tail: (suppose table had 1,2,3,4) 1 2 3 4|1 2 3 4 (actual data doubled) --------------- 1 2 3 4 5 6 7 8 (visualising joined table in eight parts) When the user scrolls backwards to 1/8th of the joined table, user is actually at the 1/4th of actual data, so we scroll instantly (we take user) to the 5/8th of the joined table where the cells are exactly the same. Similarly, when user scrolls to 6/8th of the table, we will scroll back to 2/8th where the cells are same. (I'm using 6/8th when 7/8th sound more logical because 6/8th is good for small tables.) In simple words, when user reaches 1/4th of the first half of table, we scroll to 1/4th of the second half, when he reaches 2/4th of the second half of table, we scroll to the 2/4 of first half. This is done simply by subtracting OR adding half the length of the new/joined table. */ -(void)scrollViewDidScroll:(UIScrollView *)scrollView_ { CGFloat currentOffsetX = scrollView_.contentOffset.x; CGFloat currentOffSetY = scrollView_.contentOffset.y; CGFloat contentHeight = scrollView_.contentSize.height; if (currentOffSetY < (contentHeight / 8.0)) { scrollView_.contentOffset = CGPointMake(currentOffsetX,(currentOffSetY + (contentHeight/2))); } if (currentOffSetY > ((contentHeight * 6)/ 8.0)) { scrollView_.contentOffset = CGPointMake(currentOffsetX,(currentOffSetY - (contentHeight/2))); } } 

पीएस – मैंने अपने कोड में से एक को एनटी टाइम टेबल (लाइट) कहते हुए इस्तेमाल किया है यदि आप पूर्वावलोकन चाहते हैं, तो आप ऐप देख सकते हैं: https://itunes.apple.com/au/app/nt-time-table-lite/id528213278?mt=8

यदि आपकी तालिका कभी-कभी बहुत छोटी हो सकती है, तो उपरोक्त विधि की शुरुआत में आप उस विधि से बाहर निकलने के लिए एक तर्क जोड़ सकते हैं, जब डेटा गणना 9 से कम उदाहरण के लिए कहती है

आम तौर पर मैं scrollViewDidEndDecelerating ओवरराइड करता हूं और इसके अंदर मैं अपने कोड को अधिक डेटा का अनुरोध करने देता हूं।
उदाहरण:

 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height; if (endScrolling >= scrollView.contentSize.height){ //put here your code } } 

हाल ही में मैंने गिथहब पर UITableView के उपवर्ग को अपलोड किया है, जो अनंत स्क्रॉल लागू करता है।
आप द्वारा इसे यहां पर डाउनलोड किया जा सकता है:
https://github.com/alchimya/iOS-LazyTableView

मेरे लिए बेहतर स्क्रॉल करें ViewDidEndDragging: scrollViewDidScroll से:।

दूसरा दृष्टिकोण आपको स्क्रॉल के दौरान प्रत्येक स्थिति और कारण भेज देगा, यदि आप दूरस्थ संसाधन ला रहे हैं तो आप अपने समापन बिंदु को कई बार हिट करेंगे, जो अच्छा नहीं है।

@ कनिलागोमेज़्रिको से टिप्पणियों के साथ @ कॉडफी समाधान के आधार पर पूरी तरह से सामग्री की गणना करने के तरीके के बारे में:

 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { CGFloat actualPosition = scrollView.contentOffset.y; CGFloat contentHeight = scrollView.contentSize.height - (self.tableView.frame.size.height); if (actualPosition >= contentHeight) { // fetch resources [self.tableView reloadData]; } } 

ओवरराइड के बजाय हम इसे लेआउट में बेहतर ढंग से कर सकते हैं। यहां बताया गया है कि मैंने इसे कैसे लागू किया। आप यहां कार्यान्वयन के बारे में अधिक जानकारी प्राप्त कर सकते हैं

 - (void)layoutSubviews{ [super layoutSubviews]; if(self.delegateForViews){ CGPoint contentOffset = self.contentOffset; if([self.delegateForViews noOfViews]>numOfReusableViews){ NSUInteger centerIndex=visibleViews.count/2; NSUInteger noOfViews=[self.delegateForViews noOfViews]; UIView *centerView=[visibleViews objectAtIndex:centerIndex]; CGPoint centerViewOrigin=centerView.frame.origin; CGSize centerViewSize=centerView.frame.size; CGFloat offsetDifference=contentOffset.x-centerViewOrigin.x; CGFloat offsetDifferenceAbs=fabs(contentOffset.x-centerViewOrigin.x); if(offsetDifferenceAbs>=centerViewSize.width){ if(offsetDifference<0){ currentPosition--; }else{ currentPosition++; } self.contentOffset=centerViewOrigin; currentPosition=[self getPosition:currentPosition noOfViews:noOfViews]; [self.delegateForViews clearView:centerView]; [self.delegateForViews setupView:centerView forPosition:currentPosition]; for (int i=centerIndex-1; i>=0; i--) { UIView* prevView=[visibleViews objectAtIndex:i]; [self.delegateForViews clearView:prevView]; [self.delegateForViews setupView:prevView forPosition: [self getPosition:currentPosition-1 noOfViews:noOfViews]]; } for (int i=centerIndex+1; i<visibleViews.count; i++) { UIView* nextView=[visibleViews objectAtIndex:i]; [self.delegateForViews clearView:nextView]; [self.delegateForViews setupView:nextView forPosition: [self getPosition:currentPosition+1 noOfViews:noOfViews]]; } } } } } 

सरल में से एक और मुझे जो सब कुछ मैं चाहता हूं वह यह वर्ग है:

https://github.com/jakemarsh/JMStatefulTableViewController

आपको सिर्फ JMStatefulTableViewController subclass की आवश्यकता है और इसके पास 3 विधियों को ओवरराइट करने की आवश्यकता है:

  • प्रारंभिक डेटा प्राप्त करने के लिए, जो एक init पर कहा जाता है
    • statefulTableViewControllerWillBeginInitialLoading
  • एक जब उपयोगकर्ता ताज़ा करने के लिए खींचें
    • statefulTableViewControllerWillBeginLoadingFromPullToRefresh
  • एक जब अनंत स्क्रॉल (अगले पृष्ठ) के लिए कहा जाता है
    • statefulTableViewControllerWillBeginLoadingNextPage

इसका उपयोग कोकोपॉड से भी किया जा सकता है