在popToRootViewControllerAnimated之后dealloc或删除self.navigationController中的ViewControllers:调用YES

时间:2014-03-18 13:16:00

标签: ios iphone objective-c

我正在使用一个调用

的注销按钮
[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];

4 个答案:

答案 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。将这些属性转换为私有变量,然后使用公共方法来访问它们。