Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 更改navigationController.delegate会导致访问错误_Objective C_Ios_Uinavigationcontroller - Fatal编程技术网

Objective c 更改navigationController.delegate会导致访问错误

Objective c 更改navigationController.delegate会导致访问错误,objective-c,ios,uinavigationcontroller,Objective C,Ios,Uinavigationcontroller,这听起来可能是个新手问题,但我是新的iOS开发人员 我在navigationController中推送了一个视图,假设它是第三个推送视图。 在该视图中,我设置self.navigationController.delegate=self。我更改了委托,因为当用户转到上一个视图(即从当前视图弹出)时,我需要处理案例 - (void)navigationController:(UINavigationController *)navigationController willShowViewCont

这听起来可能是个新手问题,但我是新的iOS开发人员

我在navigationController中推送了一个视图,假设它是第三个推送视图。 在该视图中,我设置self.navigationController.delegate=self。我更改了委托,因为当用户转到上一个视图(即从当前视图弹出)时,我需要处理案例

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if ([[viewController class] isEqual:[MainViewController class]]) {
        ...
    }
}
它工作正常,但当我弹出当前视图并再次按下导航返回按钮(即切换到第一个按下的视图)时,我得到了错误的访问错误

那么我错过了什么?
按下导航后退按钮的正确方法是什么

这是因为导航控制器向弹出和取消分配的视图控制器发送一条消息,所以每次弹出和推送视图控制器时,您都必须设置代理。同时添加
self.navigationController.delegate=nil以解除viewController的锁定方法。

将下面的位置放置在viewController中,您可以在其中分配self.navigationController.delegate=self

-(void) viewWillDisappear:(BOOL) animated
{  
   [super viewWillDisappear:animated];
   if ([self isMovingFromParentViewController])
   {
      if (self.navigationController.delegate == self)
      {
           self.navigationController.delegate = nil;
      }
   }
}

实际上,在dealloc中将委托设置为零并没有帮助。。。在我的例子中,第三个视图实现了UINavigationControllerDelegate,而其他视图没有?那么,在所有视图中,我需要在哪里将委托设置为self呢?如果我得到正确的答案,那么在视图中,委托应该设置为nil,在视图中,每次推送或弹出时,If都设置为self。至少我已经这么做了,而且看起来很有效。。。请确认。当然,必须为每个视图控制器设置。确认。您应该将delegate设置为nil的原因是为了避免“挂起”指针(指向释放内存的指针)。EXC_BAD_访问通常发生在您向解除分配对象发送消息时,因为导航控制器的委托是解除分配对象,所以您一直收到该错误。