Objective c 更改navigationController.delegate会导致访问错误
这听起来可能是个新手问题,但我是新的iOS开发人员 我在navigationController中推送了一个视图,假设它是第三个推送视图。 在该视图中,我设置self.navigationController.delegate=self代码>。我更改了委托,因为当用户转到上一个视图(即从当前视图弹出)时,我需要处理案例Objective c 更改navigationController.delegate会导致访问错误,objective-c,ios,uinavigationcontroller,Objective C,Ios,Uinavigationcontroller,这听起来可能是个新手问题,但我是新的iOS开发人员 我在navigationController中推送了一个视图,假设它是第三个推送视图。 在该视图中,我设置self.navigationController.delegate=self。我更改了委托,因为当用户转到上一个视图(即从当前视图弹出)时,我需要处理案例 - (void)navigationController:(UINavigationController *)navigationController willShowViewCont
- (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_访问通常发生在您向解除分配对象发送消息时,因为导航控制器的委托是解除分配对象,所以您一直收到该错误。