У меня есть схема UINavigation со страницей приветствия, средней страницей и страницей подробностей.
На средней странице есть сегментированный контроллер, который может поменять основную часть этой страницы между таблицей, календарем и MKMapView, каждый из которых реализован со своими собственными классами контроллера представления.
Сегодня я реализовал MapView и его аннотации и все такое. Мило. А подробное раскрытие каждой выноски переносит вас на страницу подробностей точно так же, как если бы вы попали туда через таблицу. Прекрасный.
У меня также есть кнопка панели правой кнопки, которая выдвигается в режиме поиска. Оттуда вы можете искать данные, по которым я перемещаюсь. Когда он завершает фильтрацию данных (массив объектов, которые я храню в одноэлементном хранилище данных), он заставляет таблицу перезагружать свои данные и вызывает мои методы annotation-clearer-and-builder в представлении карты, а затем выскакивает сам. так что «средняя» страница (включая все, что было в ее представлении) вернулась на экран.
Проблема в том, что если я пару раз перехожу между картой и поиском, любое упоминание о табличном представлении приводит к сбою: *** -[CALayer retain]: message sent to deallocated instance 0x710b810
. (У меня явно включены NSZombies.)
Я поместил NSLog в метод dealloc моего контроллера табличного представления. Эту вещь никогда не вызывают. Я не знаю, закидываем ли мы это за кулисы в целях памяти, или я сливаю это и не могу вернуть свои руки, или что. Я в недоумении о том, где искать. Есть намеки?
EDIT:
Вот код, где я меняю контроллеры для основного вида моего «среднего» 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];
}
}
Согласно Адаму ниже, я делаю removeFromSuperview
там. Я пытался вставить сохранение в oldView непосредственно перед его удалением, но это не помогло.
Спасибо!