2011-05-10 3 views
2

J'utilise Cocoanetic's pull-to-reload mais avec une torsion: je voudrais que l'UITableView puisse tirer, pour ainsi dire, pour charger plus de données.Quel est le bon endroit pour ajouter une sous-vue dépendante de scrollView.contentSize?

J'ai personnalisé les classes et j'ai réussi à ajuster toutes les fonctionnalités pour supporter cela. Ce qui m'a bloqué, fondamentalement, est où dans mon code pour créer et ajouter la vue supplémentaire.

J'ai d'abord essayé de l'ajouter dans viewDidLoad de la classe de Cocoanetic (un UITableViewController):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    refreshHeaderView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.view.bounds.size.height, 320.0f, self.view.bounds.size.height)]; 
    refreshFooterView = [[EGORefreshTableFooterView alloc] initWithFrame:CGRectMake(0.0f, 0.0f + self.tableView.contentSize.height, 320.0f, 20.0f)]; 
    [self.tableView addSubview:refreshHeaderView]; 
    [self.tableView addSubview:refreshFooterView]; 
    self.tableView.showsVerticalScrollIndicator = YES; 
} 

Cela ne fonctionne pas, comme self.tableView.contentSize.height est égal à zéro à ce stade, car la table n'a pas encore chargé ses données .

Ne vous inquiétez pas, je pensais, et a essayé de l'ajouter dans le viewDidLoad de la sous-classe UITableViewController j'ai fait:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // stuff 
    self.model = [ListingModel listingModelWithURL:@"avalidurl" delegate:self]; 
    refreshFooterView = [[EGORefreshTableFooterView alloc] initWithFrame:CGRectMake(0.0f, 0.0f + self.tableView.contentSize.height, 320.0f, 20.0f)]; 
    [self.tableView addSubview:refreshFooterView]; 
} 

Remarque Je mets d'abord le modèle, mais aussi ne fonctionne pas, pour la même raison. Je suppose que la table n'a pas encore été aménagée. Dans la frustration que j'ai donné ma classe une propriété BOOL et une méthode addFooter (le BOOL pour vous assurer qu'il est appelée une seule fois) appelé de tableView:cellForRowAtIndexPath: qui est évidemment loin de la bonne manière ™

Alors ce qui, compte tenu de ce scénario, être le bon moyen?

Répondre

2

La solution était plus facile que je ne le pensais et 7KV7 m'a donné l'indice dont j'avais besoin.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // stuff 
    self.model = [ListingModel listingModelWithURL:@"avalidurl" delegate:self]; 
    /* 
    We're forcing a reload of the table here, that way the table has a 
    contentSize, so adding the footerView now works correctly. 
    */ 
    [self.tableView reloadData]; 
    [self addRefreshFooter]; 
} 
1

De cette question précédente SO Get notified when UITableView has finished asking for data? subclassing reloadData de UITableView est la meilleure approche:

- (void)reloadData { 

    NSLog(@"BEGIN reloadData"); 

    [super reloadData]; 

    NSLog(@"END reloadData"); 

} 

reloadData ne se termine pas avant la table a fini reload ses données. Ainsi, lorsque le second NSLog est déclenché, la vue de table a fini de demander des données.

Si vous avez sous-classé UITableView pour envoyer des méthodes au délégué avant et après reloadData. Il fonctionne comme un charme.

+0

Alors, comment procéder ainsi, en gardant à l'esprit que j'utilise un UITableViewController? Je charge un UITableView à partir d'une plume, d'où ma question supplémentaire :) – Zsub

Questions connexes