在iOS上,为什么会立即解除视图控制器后面的当前视图控制器不起作用?

时间:2012-09-26 10:58:39

标签: ios uiviewcontroller uikit

以前的代码

[self presentViewController:aNewViewController animated:YES completion:nil];

selfaNewViewController属于同一个类,因此它是一个通过水平翻转不断呈现新页面(具有不同数据)的页面。

但是,由于presentViewController以这种方式会导致内存使用越来越多(有点像Web浏览器只有越来越多的后退和前进历史记录),所以我将代码更改为:

[self.presentingViewController dismissViewControllerAnimated:NO 
          completion:^{
              [self.presentingViewController 
                        presentViewController:aNewViewController
                        animated:YES completion:nil];
}];

但由于某种原因,它只是“返回”前一个视图控制器的视图,而不是去新的视图(aNewViewController)。最初,我将上面的代码一个接一个地放在两条平行线上,然后我将第二条线放在第一个调用的完成块中。而这两种方法都无法按预期工作。是否有一些棘手的事情使它不能进入​​新的视图控制器?

此外,它曾经具有翻转到新内容的良好效果,但是现在,如果它有效,它可能会翻到第一页(起始页),然后翻到结果页面,然后,再次翻到起始页面。因为起始页面看起来与结果页面完全不同,所以我宁愿继续翻转显示结果页面(从一个结果页面翻转到另一个结果页面)。如果我将“dismiss”设置为没有动画,它将没有翻转动画,但它仍将首先显示起始页面,然后翻转到结果页面。有办法解决这个问题吗?

更新:解雇后self不再存在是不是真的? (该对象是dealloc'ed)。上面的代码实际上是在一个类方法中完成的(该类是aNewViewController的同一个类,它是结果页面的视图控制器)。为了解决self问题,我尝试先设置一个局部变量

UIViewController *presentingViewController = foo.presentingController;
[presentingViewController dismissViewControllerAnimated:NO 
          completion:^{
              [presentingViewController 
                        presentViewController:aNewViewController
                        animated:YES completion:nil];
}];

(传入foo,其值为self)。那真的有效!但是,如果它不是类方法但是实例方法...会self不再存在吗? (如果它是在一个实例方法中,完成块是否会使对象保持活动状态?但是在完成块之后,谁保持对象活着呢?)我在类方法中做到了,因为那时起始页只能调用它提供此页面的类方法(使用URL数据获取逻辑)。

1 个答案:

答案 0 :(得分:0)

您需要在这两个转换之间添加一些延迟。尝试添加0.40的dealy。与[self performSelector:@selector(anySelector:) withObject:nil afterDelay:0.40];

一样