2013-02-18 24 views

Trả lời

28

Tôi tin rằng sẽ không có bất kỳ giải pháp đơn giản nào cho vấn đề này. Có thể ai đó có thể viết một thư viện riêng biệt để thực hiện hành vi này cộng với nó sẽ gây ra nhiều biến chứng hơn khi bạn lưu trữ dữ liệu trong tableview.

Nhưng hãy để chúng tôi chia nhỏ sự cố và có thể giúp bạn đạt được những gì bạn muốn. Tôi đã sử dụng đoạn mã sau để thêm nhiều hàng trong ứng dụng:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height; 
    if (endScrolling >= scrollView.contentSize.height) 
    { 
     NSLog(@"Scroll End Called"); 
     [self fetchMoreEntries]; 
    } 
} 

Hoặc bạn có thể làm điều gì đó như thế:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height) 
    { 
     if (!self.isMoreData) 
     { 
      self.MoreData = YES; 

      // call some method that handles more rows 
     } 
    } 
} 

Bạn phải đã thấy phương pháp như vậy trong nhiều câu hỏi như tôi đã mô tả ở trên và chắc chắn không phải những gì bạn đã yêu cầu. Nhưng những gì bạn có thể làm là trong khi mã trên đang trong quá trình tải nhiều dữ liệu hơn, bạn có thể thêm một subview và hiển thị một vài hình ảnh tương tự như những gì UIRefreshControl cung cấp. Thêm hình ảnh trong subview sẽ được hiển thị như một tiến trình cho đến khi mã trên được thực hiện. Trang chủ này giúp.

Nhân tiện, tôi sẽ đề nghị bạn không làm điều đó vì nó sẽ lãng phí thời gian của bạn để làm một cái gì đó nhỏ hơn trừ khi bạn chỉ làm việc đó cho mục đích học tập.

4

Trên thực tế, khung công tác Bảng nhạy cảm miễn phí cung cấp chức năng này ra khỏi hộp. Bạn chỉ định số lô và nó sẽ tự động tìm nạp dữ liệu, hiển thị ô cuối cùng dưới dạng ô 'tải thêm'. Khi bạn nhấp vào ô đó, nó sẽ tự động tải lô tiếp theo, v.v. Đáng xem xét.

+0

Vui lòng khai báo quan hệ của bạn với khung này (nếu có) tại thời điểm này đọc như nó có thể là thư rác. – ChrisF

+1

Không liên kết theo bất kỳ cách nào !! Chỉ là một fan hâm mộ lớn! – Matt

+0

Tôi đã tìm ra điều đó - nhưng có thể không. – ChrisF

10

Bạn có thể sử dụng UIView để tùy chỉnh refreshControl của bạn ở dưới cùng. Tạo UIView và thêm nó vào UITableView dưới dạng footerView.

UIView* footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)]; 

[footerView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"refreshImage.png"]]]; 

tableView.tableFooterView = footerView; 

Hide nó: tableView.tableFooterView.hidden = YES;

Thực hiện UIScrollView đại biểu -

(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height) 
    { 
      tableView.tableFooterView.hidden = NO; 
      // call method to add data to tableView 
    } 

} 

trước khi thêm dữ liệu để tableView tiết kiệm hiện tại bù đắp bởi CGPoint offset = tableView.contentOffset;

reloadData cuộc gọi sau đó thiết lập lưu trước đó bù đắp lại tableView [tableView setContentOffset:offset animated:NO];

Để bạn có thể cảm thấy dữ liệu mới được thêm ở dưới cùng.

+0

Bất cứ ai đã thử điều đó? nó có hoạt động không? – Ricardo

+1

Tôi đang sử dụng ứng dụng này trên ứng dụng iOS 7 và có vẻ như nó hoạt động. Tôi thực sự đang đặt 'tableFooterView' của mình thành chế độ xem 'UIRefreshControl'' – hunteros

+1

xin lỗi,' UIActivityIndicatorView' không phải là 'UIRefreshControl'! – hunteros

8

Gần đây tôi đã gặp vấn đề tương tự và viết một danh mục cho lớp UIScrollView. Đây là CCBottomRefreshControl.

+0

Có sự phụ thuộc ReactiveCocoa, vì vậy nó vô dụng. –

+1

Làm việc hoàn hảo cho tôi. Tất cả các phương pháp sử dụng phương pháp UIScrollViewDelegate là một nỗi đau trong ass về hiệu suất. Phương pháp này sử dụng phần tử UIRefreshControl mặc định, tốt hơn nhiều so với mọi cách tiếp cận khác mà tôi gặp phải. – marcelosalloum

+0

Nhưng tôi đang gặp vấn đề. Tôi không thể xóa UIRefreshcontroller sau khi tải dữ liệu. [refreshController endRefreshing] không làm gì cả. –

2

Đối với UITableView tôi đề nghị các phương pháp sau đây:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    // if this is the last row that we have in local data 
    // and we didn't reach the total count of rows from the server side 
    if (count == indexPath.row+1 && count < total) 
    { 
     // .. fetch more rows and reload table when data comes 
    } 
} 

Tôi không sử dụng các phương pháp xem cuộn cố ý vì xem cuộn là chậm. Điều đó xảy ra khi cuộn chế độ xem cuộn, chúng tôi yêu cầu thêm dữ liệu, làm mới nhiều hàng hơn và chế độ xem cuộn chưa hoàn tất với cuộn, nó vẫn giảm tốc và gây ra sự cố khi tìm nạp thêm dữ liệu.

+0

hãy giải thích ngắn gọn @Prcela –

2

Câu trả lời sau nằm trong Xcode 8 và Swift 3.

khai báo đầu tiên

var spinner = UIActivityIndicatorView() 

hơn trong viewDidLoad phương pháp viết đoạn mã sau:

spinner = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge) 
spinner.stopAnimating() 
spinner.hidesWhenStopped = true 
spinner.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 60) 
tableView.tableFooterView = spinner 

bây giờ cuối cùng override phương pháp scrollViewDidEndDragging đại biểu với sau:

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
     let offset = scrollView.contentOffset 
     let bounds = scrollView.bounds 
     let size = scrollView.contentSize 
     let inset = scrollView.contentInset 

     let y = offset.y + bounds.size.height - inset.bottom 
     let h = size.height 

     let reloadDistance = CGFloat(30.0) 
     if y > h + reloadDistance { 
      print("fetch more data") 
      spinner.startAnimating() 
     } 
} 
+0

Đây là câu trả lời đúng nhất trong năm nay. Tôi đã được sử dụng CCBottomRefreshControl cho đến khi tôi đã phải convetr dự án của tôi để nhanh chóng 3,0 và nó bắt đầu đâm ở khắp mọi nơi. Đây là một giải pháp tốt hơn nhiều. Cảm ơn bạn! –

+0

Người đàn ông, bạn đã cứu ngày của tôi. Đây là giải pháp tốt nhất cho nhanh 3 –