Изменение NavigationController.delegate приводит к плохому доступу

#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;
      }
   }
}