我正在使用一个调用
的注销按钮[self.navigationController popToRootViewControllerAnimated:YES];
方法。调用此函数后,我想取消分离或删除存储在'堆栈中的先前ViewControllers。 self.navigationController.viewControllers
我尝试了几种方法来删除'堆栈',一个通过:
NSMutableArray *stack = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
[stack removeAllObjects];
self.navigationController.viewControllers = stack;
到目前为止,我所做的一切都没有删除堆栈。我知道他们没有被删除,因为我通过
进行测试NSLog(@"%d", (int)self.navigationController.viewControllers.count);
[self.navigationController popToViewController:self.navigationController.viewControllers[2];
它仍会弹出到ViewController。
任何想法?
更新:通话中的逻辑
调用Pop方法的ViewController
[self.navigationController popToRootViewControllerAnimated:YES];
RootViewController的
NSLog(@"%d", (int)self.navigationController.viewControllers.count);
[self.navigationController popToViewController:self.navigationController.viewControllers[2];
答案 0 :(得分:0)
调用popViewController后,您的堆栈将被删除:检查 试试这个
[self.navigationController popToViewController:self.navigationController.viewControllers[2];
double delayInSeconds = .1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSLog(@"%d", (int)self.navigationController.viewControllers.count);
});
而不是
NSLog(@"%d", (int)self.navigationController.viewControllers.count);
[self.navigationController popToViewController:self.navigationController.viewControllers[2];
答案 1 :(得分:0)
您应该在>> 后调用堆栈中的视图控制器popToViewController:
方法(在您提供的代码中使用NSLog
方法 之前调用popToViewController:
方法。
只需尝试此代码即可看到" BEFORE POP"大于"在POP"。
NSLog(@"BEFORE POP: %d", (int)self.navigationController.viewControllers.count);
[self.navigationController popToRootViewControllerAnimated:YES];
NSLog(@"AFTER POP: %d", (int)self.navigationController.viewControllers.count);
popToViewController
方法将删除作为参数传递的viewController
后添加到堆栈中的所有viewController
。如果你在YES
中传递popToRootViewControllerAnimated:
并不重要,在动画完成之前调用此方法后,堆栈将立即更新。虽然实际的视图控制器对象可能会在动画完成之前保留,但是UINavigationController
的{{1}}的工作,所以不要担心。
答案 2 :(得分:0)
[self.navigationController popToRootViewControllerAnimated:YES];
在弹出动画完成后,将更新堆栈内容。
假设您有这样的层次结构:
NavigationController RootViewController的 FirstViewController SecondViewController
你的筹码数应为3
如果你打电话 [self.navigationController popToRootViewControllerAnimated:YES]; 在任何视图控制器中,在动画结束时,您的层次结构应如下所示:
NavigationController RootViewController的
你的堆栈计数应为1
如果不是这种情况,那么也许你在某种程度上破坏我们尚未见过的代码堆栈。
答案 3 :(得分:0)
你在使用ARC吗?如果是这样,弹出的视图控制器将自动解除分配。如果它们没有被释放,那么ARC会保留一些变量。看看你的代码,看看你是否在视图控制器中声明了一些强引用。
例如,即使从导航控制器中弹出视图控制器,非IBOutlet的属性也会导致ARC保留它们,并且永远不会在这些视图控制器上调用dealloc。将这些属性转换为私有变量,然后使用公共方法来访问它们。