J'ai un système UINavigation avec une page "bienvenue", une page du milieu et une page de détails. Dans la page du milieu, il y a un contrôleur segmenté qui peut permuter le corps principal de cette page entre une table, un calendrier et un MKMapView, chacun implémenté avec leurs propres classes de contrôleurs de vues.Le contrôleur UIView est mystérieusement désalloué
Aujourd'hui j'ai implémenté MapView et ses annotations et tout ça. C'est bien. Et une description détaillée sur chaque légende vous amène à la page de détail de la même manière que si vous étiez arrivé par la table. Charmant.
J'ai également un bouton de barre de bouton droit qui pousse dans une vue "de recherche". De là, vous pouvez rechercher les données que je suis en train de naviguer. Une fois le filtrage des données (un tableau d'objets que je garde dans un singleton de données), la table recharge ses données et appelle mes méthodes annotation-clearer-and-builder dans la vue de la carte, puis apparaît , donc la page "du milieu" (y compris la vue qui était dans les tripes) est de retour sur l'écran.
Le problème est que si je fais plusieurs allers-retours entre la carte et la recherche plusieurs fois, toute mention de la vue de la table provoque un plantage avec: *** -[CALayer retain]: message sent to deallocated instance 0x710b810
. (J'ai évidemment NSZombies allumé.)
J'ai mis un NSLog dans la méthode dealloc de mon contrôleur de vue de table. Cette chose ne s'appelle jamais. Je ne sais pas si nous l'abandonnons dans les coulisses à des fins de mémoire, ou si je fuis et que je ne peux pas remettre mes mains dessus, ou quoi. Je ne sais pas où regarder. Des indices?
EDIT:
Voici le code où j'échange dans les contrôleurs pour la vue principale de mon "milieu" viewController:
- (IBAction)switchView:(id)sender
{
UISegmentedControl *seg = (UISegmentedControl *)sender;
NSInteger choice = [seg selectedSegmentIndex];
NSArray *array = [mainView subviews];
UIView *oldView = [array objectAtIndex:0];
[oldView removeFromSuperview];
if (choice == 0) {
if (!self.tableController)
self.tableController = [[EventsTableViewController alloc]
initWithNibName:@"EventsTableView" bundle:nil];
[mainView addSubview:self.tableController.view];
}
if (choice == 1) {
if (!self.calendarController)
self.calendarController = [[EventsCalendarViewController alloc]
initWithNibName:@"EventsCalendarView" bundle:nil];
[mainView addSubview:self.calendarController.view];
}
if (choice == 2) {
if (!self.mapController)
self.mapController = [[EventsMapViewController alloc]
initWithNibName:@"EventsMapView" bundle:nil];
[mainView addSubview:self.mapController.view];
}
}
par Adam ci-dessous, je fais removeFromSuperview
là. J'ai essayé de coller dans une retenue sur oldView juste avant de le retirer, mais cela n'a pas aidé.
Merci!
sera très difficile pour quiconque de vous aider sans un code – Daniel