2012-10-09 15 views
6

Sto cercando di implementare il UIRefreshControl nella mia applicazione. Ho un file xib e ho aggiunto un UITableViewController al file pennino vuoto e ho impostato la proprietà di aggiornamento su "enabled". Inoltre ho aggiunto il codice allo viewDidLoad e un metodo di aggiornamento personalizzato. Il problema è che ho un errore non riesco a trovare alcuna informazione su .... nel mio viewDidLoad ottengo "Proprietà 'refreshControl' non trovato in oggetto di tipo ViewController"Problemi di UIRefreshControl

- (void)viewDidLoad{ 

[super viewDidLoad]; 

self.myTableView = 
[[UITableView alloc] initWithFrame:self.view.bounds 
          style:UITableViewStyleGrouped]; 

self.myTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
            UIViewAutoresizingFlexibleHeight; 

self.myTableView.delegate = self; 
self.myTableView.dataSource = self; 

[self.view addSubview:self.myTableView]; 

UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; 
[refresh addTarget:self action:@selector(refreshView:) forControlEvents:UIControlEventValueChanged]; 

self.refreshControl = refresh; 

} 

-(void)refreshView:(UIRefreshControl *)refresh { 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing data..."]; 

// custom refresh logic would be placed here... 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"MMM d, h:mm a"]; 
NSString *lastUpdated = [NSString stringWithFormat:@"Last updated on %@", 
           [formatter stringFromDate:[NSDate date]]]; 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdated]; 
[refresh endRefreshing]; 

} 

ho idea perché quella la proprietà non è disponibile .... cosa mi manca?

Sembra che io debba ereditare da UITableViewController nel mio file ViewController.h. Se ho già UITableView come posso ereditare da entrambi? Se cambio il mio codice ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>-ViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> poi ho un errore:

error: NSInternalInconsistencyException', 
    reason: '-[UITableViewController loadView] loaded the "ViewController_iPhone" nib but didn't get a UITableView.' 

risposta

11

È possibile aggiungere UIRefreshControl come una visualizzazione secondaria alla tua UITableView.

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

Come da commento di Dave, questo potrebbe rompersi nella versione futura di iOS. Quindi, si prega di fare attenzione durante l'utilizzo di questo e provare a sollevare un bug report to apple per quanto riguarda questo.

Aggiornamento: Un approccio migliore è con l'aggiunta di UITableViewController come ChildViewController di self e poi aggiungendo tableViewController.tableView come la visualizzazione secondaria di self.view. Non devi fare alcun trucco per farlo funzionare in questo modo.

[self addChildViewController:tableViewController]; 
[self.view addSubview:tableViewController.tableView]; 

È possibile definire la cornice per tableView conseguenza. Utilizzando questo approccio, UIRefreshControl dovrebbe funzionare nello stesso modo in cui funziona per UITableViewController. `

+3

Questo non è supportato e potrebbe rompersi nella versione futura di iOS. L'unico modo supportato per usare un 'UIRefreshControl' è con un' UITableViewController'. –

+1

@ ACB, questo è esattamente quello di cui avevo bisogno !!! Grazie mille. Vorrei poterti dare più oggetti di scena! – brianhevans

+1

Sì, è possibile avere un UIRefreshControl su una classe UIViewController con UITableView e aggiunti manualmente. I commenti altre risposte potrebbero essere vere (non va con i documenti), ma questo piccolo hack funziona su iOS6. –

1

La classe ViewController deve essere una sottoclasse di UITableViewController al fine di avere accesso alla proprietà refreshControl.

+0

Possiamo aggiungere 'UITableViewController' come un controller di visualizzazione figlio e quindi aggiungere' tableview' come sottoview di 'self.view' del controller di visualizzazione corrente, giusto? Mi stavo chiedendo se abbiamo davvero bisogno di sottoclasse? – iDev

+0

@ ACB Sì, è possibile utilizzare un 'UITableViewController' come un controller di visualizzazione figlio. Questo è un approccio eccellente. –

+0

Grazie per la conferma. Sono stato confuso da questa affermazione nella tua risposta *** "La classe ViewController deve essere una sottoclasse di UITableViewController" *** poiché è possibile aggiungerla anche come sottoview. – iDev

5

Cose da ricordare:

  • UIRefreshControl solo per UITableViewController, quindi la classe dovrebbe essere la sottoclasse di UITableViewController.

  • UITableViewController ha una proprietà refreshControl, è necessario allocare un UIRefreshControl e impostarlo su quella proprietà.

Es:

UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; 

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 

[refreshControl addTarget:self action:@selector(refreshControlAction:) forControlEvents:UIControlEventValueChanged]; 

tableViewController.refreshControl = refreshControl; 
+0

Questa è la risposta corretta. L'aggiunta manuale a 'UITableView' secondo la risposta accettata potrebbe causare un comportamento imprevisto nelle versioni future di iOS. – Samah

0

vi consiglio di fare separata UITableViewController sottoclasse per myTableView. E poi usando addChildviewController o iOS6 ContainerView per aggiungere quella classe all'interno di ViewController originale. In questo modo, anche nella parte di View, puoi usare UIRefreshControl.

La risposta accettata non è un metodo ufficiale, quindi potrebbe interromperla in futuro, come ha detto il commento ...

2

Tutti questi sono modi complessi di fare qualcosa di semplice.

Non è necessario aggiungere un controllo di aggiornamento o dichiararne uno nel viewController. L'aggiunta di pull-to-refresh è un processo in due fasi.
Passaggio 1: nello storyboard, vai al tuo tavoloViewController e, dove dice "Refreshing", seleziona "Abilitato".
Fase 2: Aggiungere il seguente codice al file tableViewController.m, in viewDidLoad:

[self.refreshControl addTarget:self 
          action:@selector(refresh) 
        forControlEvents:UIControlEventValueChanged]; 

Questo è l'intero processo, diverso da fare cose nel metodo -refresh. Quando si desidera interrompere l'aggiornamento, chiamare [self.refreshControl endRefreshing];.

+0

Grazie! Ho avuto la sensazione che tutti i tutorial che stavo leggendo fossero eccessivamente complicati. –

Problemi correlati