Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to programmatically force EGORefreshTableHeaderView to update

I am trying to force EGORefreshTableHeaderView to update from the code. When I pull down everything works perfect and the TableView (root) gets refreshed. But I have a modal view where the user can subscribe to certain entities. When he subscribes to one the reload method in the first (root) table view gets triggered. This method establishes a connection to a server, loads some specific data based on the subscription, stores it in a CoreData DB and updates the TableView (root).

The problem is that when the user is only connected to 3G or Edge network the download, which is processed in an own thread, can take several seconds. To indicate the user that something happens I would like to show the EGORefreshTableHeaderView.

I found out that I can set the indent of the refresh view and manually show the loading icon but I was wondering if there is not an easier solution by just triggering a delegate or a method on the EGORefreshTableHeaderView?

like image 723
Chris Avatar asked Dec 28 '22 00:12

Chris


2 Answers

Did you try using egoRefreshScrollViewDataSourceStartManualLoading?

Assuming your EGORefreshTableHeaderView instance is named _refreshTableHeaderView, then a call like:

[_refreshTableHeaderView egoRefreshScrollViewDataSourceStartManualLoading:self.tableView];

works for me...


So, it's been too long since I used this, and I forgot I applied the change myself...

I modified EGORefreshTableHeaderDelegate (declared in EGORefreshTableHeaderView.h) to add this additional protocol:

- (void)egoRefreshScrollViewDataSourceStartManualLoading:(UIScrollView *)scrollView;

And the implementation (in EGORefreshTableHeaderView.m):

- (void)egoRefreshScrollViewDataSourceStartManualLoading:(UIScrollView *)scrollView {
    [self setState:EGOOPullRefreshLoading];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.2];
    scrollView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f);
    [UIView commitAnimations];

    if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDidTriggerRefresh:)]) {
        [_delegate egoRefreshTableHeaderDidTriggerRefresh:self];
    }
}

Let me know if you need more help there.

(And thank-you enormego for the great work!)

like image 104
Reuven Avatar answered May 01 '23 06:05

Reuven


Thanks to Reuven and his code I have improved it a little bit that it can also be used in an UIScrollView that is larger as the screen. Additionally, I have changed the deprecated commitAnimations to block animations.

#pragma mark - Manually refresh view update
- (void)egoRefreshScrollViewDataSourceStartManualLoading:(UIScrollView *)scrollView {
    [self.refreshHeaderView setState:EGOOPullRefreshLoading];

    //animating pull down scroll view
    [UIView animateWithDuration:0.2
                     animations:^{ 
                         scrollView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f); 
                         scrollView.contentOffset = CGPointMake(0, -60.0f);
                     }
     ];

    //triggering refreshview regular refresh
    if ([self.tableView.delegate respondsToSelector:@selector(egoRefreshTableHeaderDidTriggerRefresh:)]) {
        [self egoRefreshTableHeaderDidTriggerRefresh:self.refreshHeaderView];
    }
}
like image 27
Chris Avatar answered May 01 '23 08:05

Chris