#objective-c #ios #uinavigationcontroller
#objective-c #iOS #uinavigationcontroller
Вопрос:
Это может показаться вопросом новичка, однако я новичок в разработке iOS.
У меня есть представление, добавленное в NavigationController, допустим, это 3-е отправленное представление. В этом представлении я установил self.navigationController.delegate = self;
. Я изменил делегат, потому что мне нужно обработать случай, когда пользователь переходит к предыдущему представлению, т. Е. Появляется из текущего представления.
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if ([[viewController class] isEqual:[MainViewController class]]) {
...
}
}
Все работает нормально, но когда я открываю текущий вид и снова нажимаю кнопку возврата навигации (т. Е. Переключаюсь на первый просмотр) Я получаю ошибку неправильного доступа.
Итак, чего мне не хватает? Как правильно обрабатывать нажатие кнопки возврата к навигации?
Ответ №1:
Это связано с тем, что навигационный контроллер отправляет сообщение на извлеченный и освобожденный контроллер просмотра, вам нужно устанавливать делегат каждый раз, когда вы выполняете нажатие. Также добавьте self.navigationController.delegate = nil;
в метод dealloc вашего ViewController.
Комментарии:
1. на самом деле установка значения delegate в nil в dealloc не помогла… В моем случае 3-й вид реализует UINavigationControllerDelegate, а остальные нет? Итак, где мне нужно установить делегирование для self во всех представлениях?
2. Если я вас правильно понял, для делегирования должно быть установлено значение nil в представлении, где if было установлено значение self каждый раз, когда вы собираетесь нажимать или всплывать. По крайней мере , я так сделал , и , кажется , это работает … Пожалуйста, подтвердите
3. Ну, конечно, это должно быть установлено для каждого контроллера представления. Подтвердите. Причина, по которой вы должны установить для делегирования значение nil, заключается в том, чтобы избежать «висячих» указателей (указателей на освобожденную память). EXC_BAD_ACCESS обычно происходит, когда вы отправляете сообщение освобожденному объекту, и поскольку делегат вашего навигационного контроллера был освобожденным объектом, вы получали эту ошибку.
Ответ №2:
Поместите ниже в Viewcontroller, в котором вы назначаете self.NavigationController.delegate = self
-(void) viewWillDisappear:(BOOL) animated
{
[super viewWillDisappear:animated];
if ([self isMovingFromParentViewController])
{
if (self.navigationController.delegate == self)
{
self.navigationController.delegate = nil;
}
}
}