更改UINavigationController的Stack的内容会导致崩溃

时间:2014-02-06 14:51:50

标签: ios objective-c cocoa-touch exc-bad-access

我有一个包含4个项目的UINavigationController:

  

(root)mainvc - > callerlistvc - > addcallerformvc - > verifycallervc(按特定顺序)

当我在verifycallervc屏幕上时,如果我按回去,我想回到callerlistvc。

这是捕获但是,后退按钮应该是一个系统按钮..所以...据我所知,我无法用调用poptoviewcontroller的选择器替换动作:动画(仅适用于自定义uibarbuttonitem)

然后我想到了操纵堆栈(非常有趣和具有挑战性!)所以这就是我所做的......

所以目前我正在验证callervc屏幕上...这会被调用。

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];

NSMutableArray *allViewControllers = [self.navigationController.viewControllers mutableCopy];

__block UIViewController *mainvc = nil;
__block UIViewController *callerlistvc = nil;
__block UIViewController *addcallerformvc = nil;

[allViewControllers enumerateObjectsUsingBlock:^(UIViewController *vc, NSUInteger idx, BOOL *stop) {
    if ([vc isKindOfClass:[MainVC class]]) {
        mainvc = vc;
    } else if ([vc isKindOfClass:[CallerListVC class]]) {
        callerlistvc = vc;
    } else if ([vc isKindOfClass:[AddCallerFormVC class]]) {
        addcallerformvc = vc;
    }
}];

[self.navigationController setViewControllers:@[ mainvc, callerlistvc, self]];
}

在我这样做之后,我正常按回来,现在在callerlistvc上了......很棒。 不幸的是,当我按下按钮(push-segued to addcallerformvc)时......它会导致EXC_BAD_ACCESS崩溃。

我还尝试了一种不同的方法,首先在setViewControllers方法中添加变量callerlistvc,然后将其添加到setViewControllers方法中

callerlistvc = [[UIStoryboard storyboardWithName:@"main" bundle:nil] instantiateViewControllerWithIdentifier:@"CallerListVC"];

但结果是一样的。

我添加了断点,就像这样...

CallerListVC:

  1. tappedShowAddCallerListButton
  2. performSegueWithIdentifier
  3. prepareForSegue //标识符字符串是正确的,destinationVC不是nil
  4. 然后AddCallerFormVC:  4. viewDidLoad  5. viewWillAppear //属性不是

    之后发生EXC_BAD_ACCESS

    我该如何做到这一点?

2 个答案:

答案 0 :(得分:0)

在这种情况下,更好的方法是使用自定义UINavigationController类并扩展popViewControllerAnimated:方法。在此方法中,可以调用super方法,也可以根据检查弹出特定的视图控制器(超类方法)。这样您就可以使用系统导航按钮并控制大头钉应该弹到的位置。

答案 1 :(得分:0)

不要覆盖verifycallervc中的任何内容,而是在verifycallervc

上执行正常的操作

为addcallerformvc覆盖viewWillAppear或viewDidAppear,如下所示

- (void)viewDidAppear:(BOOL)animated
{
   if (![self isBeingPresented]) {
      [self.navigationController popViewControllerAnimated:YES];
   }
}

参考: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDisplay-Notifications/RespondingtoDisplay-Notifications.html#//apple_ref/doc/uid/TP40007457-CH12-SW7

注意:未经测试,现在没有XCode ....