Bharat Bharat - 1 year ago 107
Objective-C Question

UIRefreshControl not showing indicator or title?

I want to implement Pull To Refresh to my

by using
. Here what i tried so far.

- (void)viewDidLoad
////********* Pull to refresh ************/
UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
refresh.tintColor = [UIColor magentaColor];
// [self.tableView addSubview:refresh];
// [self.refreshControl setEnabled:YES];
[refresh addTarget:self action:@selector(pullToRefresh:) forControlEvents:UIControlEventValueChanged];
self.refreshControl = refresh;

-(void)pullToRefresh:(UIRefreshControl *)refresh {
[refresh beginRefreshing];
refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing.."];
[self loadRecentActivities];

But when i pull the tableview neither activity indicator nor title is visible, however
is called and table refreshed.My app supports iOS7.0+.
What i'm missing? Any help would be appreciated?

Edit: I'v tried with
[self.refreshControl setEnabled:YES];
[self.refreshControl setEnabled:YES];
as mentioned in my edited code, but still no luck.
This is how my tableview looks like when i pull it to refresh-enter image description here

Final Solution: For table view background i was using

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.png"]];
self.tableView.backgroundView = imageView;

Refresh indicator and title was hidden behind the
instead use

[self.tableView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]]];

and it solves my problem. also many thanks to Balram Tiwari please see his answer if you still have problem.

Answer Source

Actually you have your refresh controller there in the tableView, but it is behind the navigationBar. (Sounds different, right), Here is the catch,

When you are using code in iOS7, by default the UIViewController takes the (edgesForExtendedLayout) whole screen. That means your (0,0) will start from the top left corner, underneath the navigationBar.

So your tableView is actually starting from there. So to get rid of it, you just specify the edgesForExtendedLayout for your viewController in your viewDidLoad Method.

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

After that it should be visible.

  • Before above Fix:

Before Fix

  • After the Fix.

After the Fix

hope that helps.