Donc, je suis totalement perplexe par celui-ci et tenté d'appeler "OS bug".UITableView plantage sur les mises à jour après l'édition de texte
J'ai un contrôleur TableView avec une section unique, et dans l'en-tête de cette section il y a un UITextField. Plusieurs opérations résultent en des lignes ajoutées/supprimées sans problème. Cependant, dès que le texte est modifié dans l'en-tête et que le clavier est fermé, toute insertion/suppression de lignes entraîne un plantage immédiat.
Et il peut être encore simplifié - appeler simplement beginUpdates/endUpdates sur la table une fois que le clavier est fermé est suffisant pour causer un plantage. La fin de la callstack est:
_CFTypeCollectionRetain
_CFBasicHashAddValue
CFDictionarySetValue
-[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:oldRowRange:newRowRange:context:]
-[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:]
-[UITableView endUpdates]
Je l'ai mis en place un exemple minimal qui illustre le problème.
source contrôleur complet: http://www.andrewgrant.org/public/TableViewFail.txt
Exemple de projet: http://www.andrewgrant.org/public/TableViewCrash.zip
Code le plus pertinent:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
// create header view
UIView* header = [[[UIView alloc] initWithFrame:CGRectMake(0.f, 0.f, 320.f, 50.f)] autorelease];
// text field
UITextField* textField = [[[UITextField alloc] initWithFrame:CGRectMake(10.f, 12.f, 300.f, 28.f)] autorelease];
textField.text = @"Edit, then 'Save' will crash";
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.clearButtonMode = UITextFieldViewModeAlways;
textField.delegate = self;
[header addSubview:textField];
return header;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
// no purpose, but demonstrates updates work at this point
[self.tableView beginUpdates];
[self.tableView endUpdates];
[textField resignFirstResponder];
// immediate crash
[self.tableView beginUpdates];
[self.tableView endUpdates];
return YES;
}
À noter - l'accident se produit indépendamment du fait que le délégué de textField soit le contrôleur, ou une instance d'objet totalement indépendante. –
J'ai regardé votre projet. Cela fonctionne très bien dans 3.x, mais comme vous l'avez dit, il se bloque sur 4.0 lorsque vous cliquez sur Enregistrer. +1 pour un bug difficile :) – Kalle
Une chose qui vient à l'esprit est que votre fichier XIB a une vue tabulaire qui pointe vers RootViewController comme source de données et comme délégué, tandis que le contrôleur de vue racine instancie à son tour une instance de TableViewFail Haut". Cela ne devrait pas poser de problème, mais vous avez deux tables empilées les unes sur les autres. – Kalle