2012-10-01 1 views
13

J'essaie de déplacer le UIRefreshControl au-dessus de mon headerView ou au moins de le faire fonctionner avec contentInset. Quelqu'un sait comment l'utiliser?UITableView et UIRefreshControl

J'ai utilisé un headerView pour avoir un joli fond lors du défilement dans TableView. Je voulais avoir un arrière-plan déroulant.

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
// Set up the edit and add buttons. 

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 
self.tableView.backgroundColor = [UIColor clearColor]; 

[self setWantsFullScreenLayout:YES]; 

self.tableView.contentInset = UIEdgeInsetsMake(-420, 0, -420, 0); 

UIImageView *top = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top.jpg"]]; 
self.tableView.tableHeaderView = top; 

UIImageView *bottom = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bottom.jpg"]]; 
self.tableView.tableFooterView = bottom; 

UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"settingsIcon"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings)]; 
self.navigationItem.leftBarButtonItem = leftButton; 

UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addList)]; 
self.navigationItem.rightBarButtonItem = addButton; 

//Refresh Controls 
self.refreshControl = [[UIRefreshControl alloc] init]; 

[self.refreshControl addTarget:self action:@selector(refreshInvoked:forState:) forControlEvents:UIControlEventValueChanged]; 
} 

Répondre

32

Je ne suis pas vraiment sûr de ce que vous avez l'intention est avec les choses contentInset, mais en termes d'ajouter un UIRefreshControl à un UITableView, il peut être fait. UIRefreshControl est en fait destiné à être utilisé avec UITableViewController, mais si vous l'ajoutez simplement en tant que sous-vue à UITableView, cela fonctionne comme par magie. Veuillez noter qu'il s'agit d'un comportement non documenté, qui peut ne pas être pris en charge dans une autre version d'iOS, mais il est légal car il n'utilise aucune API privée.

- (void)viewDidLoad 
{ 
    ... 
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 
    [refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged]; 
    [self.myTableView addSubview:refreshControl]; 
} 

- (void)handleRefresh:(id)sender 
{ 
    // do your refresh here... 
} 

Crédit à @Keller for noticing this.

+3

À l'intérieur d'un UIViewController normal, vous n'avez pas self.refreshControl, donc vous avez complètement tort lensovet – Godfather

+0

excellent conseil ... thx – paiego

+1

Cette méthode a quelques problèmes si votre vue de table a une vue de titre (sur iOS7 au moins). Lorsque vous faites défiler vers le bas tout en actualisant, les sections de la table sont toutes déplacées, compensées par la hauteur de la vue du titre. – AlBeebe

10

@ La réponse d'Echelon est sur place, mais j'ai une suggestion mineure. Ajoutez le contrôle d'actualisation en tant que propriété @ afin de pouvoir y accéder ultérieurement.

dans YourViewController.h

@property (nonatomic, strong) UIRefreshControl *refreshControl; 

dans YourViewController.m

-(void) viewDidLoad { 
    self.refreshControl = [[UIRefreshControl alloc] init]; 
    [self.refreshControl addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged]; 
    [self.tableView addSubview:self.refreshControl]; //assumes tableView is @property 
} 

Et la grande raison de le faire de cette façon ...

-(void)refresh { 
    [self doSomeTask]; //calls [taskDone] when finished 
} 

-(void)taskDone { 
    [self.refreshControl endRefreshing]; 
} 

vous donne juste CLASS- large accès à UIRefreshControl afin que vous puissiez endRefreshing ou vérifier la propriété isRefreshing de UIRefreshControl.

+1

'@property (non atomique, fort) UIRefreshView * refreshControl;' vous voulez probablement dire 'UIRefreshControl' ici. Droite? –

+0

@ self.name Pourquoi appelait-il 'taskDone' après avoir terminé? Ça me surprend. en fait, il devrait exécuter 'taskDone' et revenir à rafraîchir, ai-je raison? +1 pour votre réponse si. – Ron