2009-11-29 5 views
5

J'ai un TableView qui construit et dessine bien, mais qui se bloque lors du défilement de la vue. J'ai parcouru le débogueur et il semble que mes variables de niveau de classe sont en quelque sorte écrasées de sorte qu'elles n'existent plus lorsque le titleForHeaderInSection est à nouveau appelé. La chose étrange est que si je remplace le code:UITableView se bloque sur le défilement

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
NSString *sectionTitle = [favouritesDataSections objectAtIndex:section]; 
return sectionTitle; 
} 

avec:

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
NSString *sectionTitle = @"Test"; 
return sectionTitle; 
} 

Il se bloque encore mais cette fois les listes de débogage pas NSString lorsque vous survolez la variable sectionTitle.

Ceci est le code que j'utilisé pour créer le point de vue et mettre en place les variables de niveau de classe:

- (void)loadView { 
[super loadView]; 
CGRect tableSize = CGRectMake(0,0,320,460); 
UITableView *favouritesTableView = [[UITableView alloc] initWithFrame:tableSize style:UITableViewStylePlain]; 
favouritesTableView.autoresizingMask = (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight); 
favouritesTableView.dataSource = self; 
favouritesTableView.delegate = self; 
favouritesTableView.rowHeight = 52; 
[self.view addSubview:favouritesTableView]; 
} 

- (void)viewDidLoad { 
[super viewDidLoad]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
// Get the full path of the favourites plist 
NSString *filename = [documentsDirectory stringByAppendingPathComponent:@"Favourites.plist"]; 
// Initialise Dictionary and array 
favouritesDataAll = [[NSMutableDictionary alloc] init]; 
favouritesDataSections = [[NSArray alloc] init]; 

NSDictionary *dict = [[[NSMutableDictionary alloc] initWithContentsOfFile:filename] retain]; 
favouritesDataAll = dict; 
[dict release]; 

favouritesDataSections = [favouritesDataAll allKeys]; 
} 

Je vais absolument fou d'essayer de suivre cette baisse - passé 2 jours jusqu'à présent ce serait extérieurement reconnaissant pour toute aide.

Meilleures salutations

Dave

+0

OK, si je mets à retenir au bout de la ligne UITableView cela fonctionne pendant environ 3 ou quatre fois, puis la console donne: *** - [longueur UISwipeGestureRecognizer]: sélecteur non reconnu envoyé à l'instance 0x43325d0 –

+0

et aussi: *** terminaison app en raison de l'exception uncaught 'NSRangeException', raison: '*** - [NSCFArray objectAtIndex:]: index (0) au-delà des limites (0)' –

+0

OK, je vais me taire. La retenue était je red hareng je pense. C'est parce que j'ai remplacé le titleForHeaderInSection par @ "Test" cela a fonctionné pendant un moment. L'erreur de la console est: *** Terminaison de l'application due à l'exception non interceptée 'NSRangeException', raison: '*** - [NSCFArray objectAtIndex:]: index (57744) au-delà des limites (2)' –

Répondre

12

OK, il fixe ... changé

favouritesDataSections = [favouritesDataAll allKeys]; 

Pour:

favouritesDataSections = [[favouritesDataAll allKeys] retain]; 

Et tout semble fonctionner. J'en déduis que le tableau que j'utilisais pour stocker les en-têtes de section pointait vers des données qui étaient auto-libérées à un certain point aléatoire, ce qui explique pourquoi il barrait dans des endroits apparemment étranges. J'admets cependant que je suis encore à l'étape du «codage» des essais et des erreurs et que je ne comprends pas très bien ce que je fais (je suis sûr que vous vous ferez du tort en lisant ceci). Il me serait utile si vous avez des liens de pensées/commentaires à lire plus loin ou des messages sur la façon dont tout cela fonctionne (c'est-à-dire, quand et pourquoi utiliser retenez, etc.) pour approfondir ma compréhension.

Merci encore, Dave

+0

Dave, allez lire les règles de gestion de la mémoire dans la documentation d'Apple. C'est une erreur élémentaire que vous n'auriez pas commise si vous aviez un peu lu en premier. – NSResponder

+0

Très utile. J'avais un problème similaire. Merci!!!! – saimonx

0

Sons comme il y a une sorte de corruption de mémoire passe ici. Une chose que je vois est que ces appels à [super ...] devraient se produire après l'autre code dans ces méthodes. Que se passe-t-il si vous ajustez votre tableview pour n'avoir qu'une seule section?

+0

Salut Greg, Merci pour le réponse rapide. Malheureusement, mettre le super à la fin le fait planter (c'est-à-dire que le TableView n'est même pas dessiné). J'ai également essayé de mettre le compte de section manuellement à 1, le nombre de rangées dans la section à 1 et le titre de section à @ "Test". Se bloque toujours sur le parchemin. –

4

Je recommande d'utiliser les poseurs de @property pour éviter ce problème, le tableau est autoreleased, alors vous avez appelé un manuel retain, que ce soit réglé le problème, mais une solution plus simple serait à utiliser:

self.favoritesDataSection

Ceci est automatisé par @property (maintien) conservent des moyens conservent est appelée lorsque cela est défini, et relâcher quand il est mis à zéro ou à un autre objet.

Questions connexes