Ios 添加自定义后退按钮现在会导致转到RootViewController时崩溃

Ios 添加自定义后退按钮现在会导致转到RootViewController时崩溃,ios,objective-c,uinavigationcontroller,Ios,Objective C,Uinavigationcontroller,我在我的应用程序中使用了一个标准的导航控制器,但我最近不得不做一个更改,只有当用户按下导航栏上的“后退”按钮时才需要进行更改。所以为了捕捉这个,我试图创建一个自定义的后退按钮来捕捉它的选择器 现在很明显导航栏已经有了后退按钮,所以我基本上只是想覆盖/替换它。我没有做任何特别的事情,只是分配它并将其设置为导航项 UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBa

我在我的应用程序中使用了一个标准的导航控制器,但我最近不得不做一个更改,只有当用户按下导航栏上的“后退”按钮时才需要进行更改。所以为了捕捉这个,我试图创建一个自定义的后退按钮来捕捉它的选择器

现在很明显导航栏已经有了后退按钮,所以我基本上只是想覆盖/替换它。我没有做任何特别的事情,只是分配它并将其设置为导航项

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClicked)];
[self.navigationItem setLeftBarButtonItem: backBarButtonItem];
然而,问题是,在按下几次后,这个屏幕在导航中有一些深度,当我返回到rootViewController时,我得到一个异常。我猜这是因为我添加了一个后退按钮,而现在已经存在一个后退按钮,不知怎么的,导航变得不正常了,但我不知道该做什么改变

更换UINavigationController的后退按钮通常不是一个好主意,我想,这会导致不希望出现的行为

如果您需要在视图再次离开屏幕之前执行一些操作,您可以在ViewWillEnglish中实现所需的功能

如果您确实想更换“后退”按钮,则应采取不同的方法:

在UIViewController上编写一个类别,类似于:

UIViewController+BackButton.h

UIViewController+BackButton.m

这样,您就可以在viewDidLoad中的视图控制器中轻松设置自定义后退按钮,并实现方法didPressBackButton来执行自定义操作

#import UIViewController+BackButton.h

- (void)viewDidLoad
{
   [super viewDidLoad];
   [self setBackButton];
}

- (void)didPressBackButton
{
    // your code here
}

异常说明了什么?你得到了什么样的异常?我们需要看看如果设置了一个all exceptions断点并启用了zombies,会发生什么情况,然后告诉我们错误是什么,以及是否是一个释放的对象收到了消息。用后退按钮代替系统按钮是其他人没有做过的事情,所以我怀疑会是这样。期待看到发生什么。这只是一个执行错误访问backButtonClicked方法是什么?还有,点击的是什么?老鼠?不,那为什么叫它点击?为什么不叫它goBack或goToRootViewController呢。使名称具有描述性。我无法将我的更改添加到视图中,因为视图位于选项卡栏中,这些更改在切换选项卡时触发,导致我的更改在我不希望时触发。我只想在用户向后导航时触发它们。我还注意到,这个问题实际上与我的后退按钮无关,而是手动调用popViewController。我在屏幕上也有一个取消按钮,这个问题也会发生。
@implementation UIViewController (CustomBackButton)

   - (void)setBackButton
   {
      UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(goBack)];
      [self.navigationItem setLeftBarButtonItem:backBarButtonItem];
   }

   - (void)goBack
   {
       [self.navigationController popViewControllerAnimated:YES]; 
       if ([self respondsToSelector:@selector(didPressBackButton)])
       {
          [self didPressBackButton];
       }
   }

@end
#import UIViewController+BackButton.h

- (void)viewDidLoad
{
   [super viewDidLoad];
   [self setBackButton];
}

- (void)didPressBackButton
{
    // your code here
}