2010-11-21 12 views
3

Le problème est que lorsque j'essaie de supprimer toutes les entrées de mon objet de source de données et d'effacer toutes les lignes de ma vue de table, je réussis la première partie, le compteur de lignes pour afficher (méthode tableView:numberOfRowsInSection:) renvoie 0, mais les cellules contiennent toujours des données obsolètes.Actualiser TableView après avoir effacé l'objet de source de données

(ont peu réputation ici pour publier des images, donc je l'ai téléchargé à ftp: history.png)

Voici un exemple de ce que je suis en train de faire. L'icône de la corbeille efface la base de données, définit les lignes comme étant nulles, mais ces cellules restent dans la table, ce qui provoque des plantages lors du défilement.

L'objet de source de données est stocké en tant que propriété dans AppDelegate, de sorte que ViewController récupère des données à partir de cet objet.

Voici quelques code:

HistoryViewController.h

@interface HistoryViewController : UITableViewController <UITableViewDataSource> { 
    IBOutlet UITableView *historyTable; 
    SynonymsAppDelegate *appDelegate; 
} 

@property (retain) UITableView *historyTable; 

- (IBAction)clearHistory:(id) sender; 

@end 

HistoryViewController.m

@implementation HistoryViewController 

@synthesize historyTable; 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    appDelegate = (SynonymsAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [appDelegate initHistoryList]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [appDelegate.historyList count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    HistoryModel *historyEntry = [appDelegate.historyList objectAtIndex:indexPath.row]; 
    cell.textLabel.text = historyEntry.word; 
    return cell; 
} 

- (IBAction)clearHistory:(id)sender { 
    [HistoryDataController clearHistory]; // removes entries from DB 
    [appDelegate initHistoryList]; // refreshes data source object 
    [self.tableView reloadData]; // doesn't help 
} 

AppDelegate a (NSMutableArray) *historyList propriété et cette fonction:

- (void)initHistoryList { 
    HistoryDataController *historyDataController = [[HistoryDataController alloc] initWithHistoryData]; 
    historyList = [historyDataController.historyEntries retain]; 
    [historyDataController release]; 
} 

Je crois que le problème est que TableView met en cache en quelque sorte les valeurs de c'est des cellules, mais pourquoi affichage ne leur quand t ableView:numberOfRowsInSection: retours 0? Et comment purger ce cache?

Merci pour votre aide.

+0

Avez-vous essayé de définir un point d'arrêt et de voir si le numberofrows de la section est réellement appelé? –

+0

Oui, pas en définissant un point d'arrêt, cependant, j'ai enregistré les appels avec NSLog(); Lorsque vous appuyez sur le bouton de la corbeille, 1.database efface, 2.aussi bien que la propriété AppLelegate historyList, 3.rowsInSection renvoie 0, puis rien ne se passe (les cellules restent où elles sont) – nikans

Répondre

0

Donc, le problème était définitivement dû à une mauvaise compréhension des délégués et des prises TableView. Par exemple, - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section doit être remplacé par - (NSInteger)tableView:historyTable [...], ainsi awoiding création d'exemple TableView et il nous permet d'appeler reloadData pour une instance appropriée TableView dans notre méthode - (IBAction)clearHistory:(id)sender:

- (IBAction)clearHistory:(id)sender { 
    [HistoryDataController clearHistory]; 
    [appDelegate.historyList removeAllObjects]; 
    [appDelegate initHistoryList]; 
    [self.historyTable reloadData]; 
} 

Merci à tous pour votre aide.

0

Vérifiez votre UITableView IBOutlet. Si elle est mal connectée, votre appel au reloadData ne ferait rien.

+0

tout semble bien ici. 'historyTable' de la classe HistoryViewController est connecté avec UITableView .. – nikans

1

Je pense que votre problème est la ligne [self.tableView reloadData]; Ce que vous effacez est la tableView de l'UITableViewController et non l'histoireTable que je suppose que vous utilisez.

Donc un [self.historyTable reloadData]; devrait faire l'affaire.

+0

Non, j'ai déjà essayé. De plus, lors de l'utilisation de [self.tableView reloadData]; il appelle au moins tableView: numberOfRowsInSection: méthode, et quand j'essaie [self.historyTable reloadData]; ce ne est pas. Pourtant, peut-être c'est une sorte de mise en cache des cellules de la table provoque le problème? – nikans

+0

À moins que vous n'ayez deux vues de table dans votre vue, je vous recommande de supprimer historyTable, puis d'effectuer toutes les connexions à tableView à la place. À ma connaissance, il n'y a pas de cache comme celui sur lequel vous vous penchez. Lorsque vous renvoyez 0 à partir de numberOfRowsInSection, la table est effacée. Une idée pourrait être de démarrer un nouveau projet avec le modèle de navigation, ou d'ajouter un nouveau contrôleur de vue de table et d'ajouter la fonctionnalité une fonction à la fois. J'ai trouvé des problèmes comme ça. –

+0

Je suis désolé, je n'ai pas compris. historyTable est une propriété (IBOutlet) de HistoryViewController (sous-classe de UITableViewController). Qu'est-ce que tableView auquel je devrais faire des connexions?) Cependant, je vais essayer de créer cette table à partir de rien, en ajoutant des fonctionnalités petit à petit. – nikans

1

Sans plus d'informations sur votre configuration, je ne peux pas être sûr, mais c'est ce que je pense qui se passe.

Vous avez deux tableaux dans votre vue. UITableViewController crée automatiquement sa propre table si elle n'est pas donnée par le Nib. Corrigez cela en utilisant la propriété tableView dans Interface Builder et supprimez la propriété historyTable.

La propriété dataSource de votre table n'est pas définie correctement. Assurez-vous qu'il est défini sur votre objet HistoryViewController ou qu'il ne saura pas d'où récupérer les données.

De plus, vous avez une fuite de mémoire dans votre méthode initHistoryList. L'ancienne valeur historyList n'est pas publiée, elle sera donc divulguée. Mais pourquoi devez-vous appeler à la fois [HistoryDataController clearHistory] et [appDelegate initHistoryList]? La suppression de la base de données ne devrait-elle pas effacer le tableau? Si ce n'est pas le cas, vous devriez pouvoir créer un nouveau NSMutableArray dans initHistoryList au lieu de créer et de libérer un HistoryDataController.