我有一个包含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:
然后AddCallerFormVC: 4. viewDidLoad 5. viewWillAppear //属性不是
之后发生EXC_BAD_ACCESS
我该如何做到这一点?
答案 0 :(得分:0)
在这种情况下,更好的方法是使用自定义UINavigationController类并扩展popViewControllerAnimated:方法。在此方法中,可以调用super方法,也可以根据检查弹出特定的视图控制器(超类方法)。这样您就可以使用系统导航按钮并控制大头钉应该弹到的位置。
答案 1 :(得分:0)
不要覆盖verifycallervc中的任何内容,而是在verifycallervc
上执行正常的操作为addcallerformvc覆盖viewWillAppear或viewDidAppear,如下所示
- (void)viewDidAppear:(BOOL)animated
{
if (![self isBeingPresented]) {
[self.navigationController popViewControllerAnimated:YES];
}
}
注意:未经测试,现在没有XCode ....