У меня есть приложение TabView с вкладкой, в которой есть NavView в качестве одного из представлений. Это представление имеет подпредставление с TableView для хранения событий. Я включил кнопку «Добавить» в правом верхнем углу панели навигации и назначил IBAction кнопке.
Цель состоит в том, чтобы показать страницу для добавления нового события, которое определяется файлом NIB, загружаемым при создании экземпляра моего подклассового класса контроллера. Я также передаю manageObjectContext от родительского навигационного контроллера.
Это работает в первый раз, но во второй раз, когда я нажимаю кнопку «Добавить», я получаю ошибку EXC_BAD_ACCESS. Я выполнил отладку до нажатия контроллера на навигационный контроллер, и я подтвердил, что именно здесь возникает исключение. Я прочитал документы, и в нем говорится, что навигационный контроллер вытолкнет контроллер, нажав кнопку «Назад», расположенную в верхней части навигационной панели. Я также знаю, что возникнет необработанное исключение, если я попытаюсь поместить одно и то же представление в стек. Я даже пытался вернуться к root непосредственно перед нажатием, чтобы очистить стек, но все равно получаю исключение при нажатии во второй раз.
Должен ли я выталкивать это вручную (то есть навигационная кнопка «назад» на самом деле не выталкивает это) где-то еще? Я также подтвердил, что экземпляр как навигационного контроллера, так и вновь созданного экземпляра контроллера представления не пусты.
Вот фрагмент кода для кнопки «Добавить»:
- (IBAction) addEvent: (id)sender {
// Here we'd instantiate an instance of our Add Event Controller to show the form that allows us to enter a new event.
// We'd add the context to the class from here so that it can get to our Core Data
EventEntryViewController *fvController = [[EventEntryViewController alloc] initWithNibName:@"AddEventView" bundle:nil];
fvController.managedObjectContext = self.managedObjectContext;
[self.navigationController pushViewController:fvController animated:YES];
[fvController release];
fvController = nil;
}
Спасибо за любую помощь.
Обновлять:
Хорошо, я предотвратил возникновение исключения. Я попробовал очень простое представление, в котором ничего не было, IBOutlets или IBActions и класс контроллера, у которого не было атрибутов. Это сработало, поэтому я решил, что это проблема с моим EventEntryViewController. Он мало что сделал, а обратная трассировка показала, что он умирает на внутренностях отображения представления, поэтому я даже не добрался до метода loadView, не говоря уже о любой другой части моего кода. У меня было несколько атрибутов класса, которые были инициализированы при предыдущей загрузке, и как добропорядочный гражданин я освободил их в viewDidUnload() и освободил их в Dealloc(). Когда я закомментировал раскладку атрибутов моего класса, это сработало!
Меня это смутило, и я поместил строки NSLog() в viewDidLoad(), viewDidUnload() и dalloc(). Вот результаты двух последовательностей push после того, как я удалил dallocs атрибутов моего класса:
2010-09-18 20:17:46.224 myFuel[6435:207] EventTableNavViewController: viewDidAppear
2010-09-18 20:17:51.391 myFuel[6435:207] **EventEntryViewController**: View Did Load // loading up my class
2010-09-18 20:17:53.954 myFuel[6435:207] EventTableNavViewController: viewWillAppear
2010-09-18 20:17:54.314 myFuel[6435:207] EventTableNavViewController: viewDidAppear
2010-09-18 20:17:54.315 myFuel[6435:207] **EventEntryViewController**: dalloc // after the class should have been popped
2010-09-18 20:18:02.803 myFuel[6435:207] **EventEntryViewController**: View Did Load //loading up my class
2010-09-18 20:18:08.134 myFuel[6435:207] EventTableNavViewController: viewWillAppear
2010-09-18 20:18:08.494 myFuel[6435:207] EventTableNavViewController: viewDidAppear
2010-09-18 20:18:08.495 myFuel[6435:207] **EventEntryViewController**: dalloc // after the class should have been popped
Я что-то упустил здесь? Разве представление не должно вызывать viewDidUnload(), тем самым освобождая атрибуты класса? Я вижу, как вызывается Dealloc, но где я могу их освободить?