2012-09-26 48 views
3

该作品曾经是在iOS上,为什么会忽略当前视图控制器紧跟的视图控制器不起作用?

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

self的代码是同一类aNewViewController,所以它是在呈现一个新的页面(使用不同的数据),通过水平翻转保持一个页面。

但因为以这种方式presentViewController可能导致内存使用率越来越多(有点像一个网页浏览器只是有更多的前进和后退更多的历史),所以我改变了代码:

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

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

此外,它过去有翻转新内容的好效果,但现在,如果它起作用,它可能会翻回到第一页(起始页),然后翻到结果页面,然后再次翻到起始页面。由于起始页面与结果页面看起来有很大不同,我宁愿继续翻页显示结果页面(从一个结果页面翻到另一个结果页面)。如果我将“解散”设置为没有动画,它将不会有翻动画,但它仍然会首先显示起始页面,然后翻转到结果页面。有没有办法解决这个问题?

更新:self在辞退后是否不复存在? (该对象被释放)。上面的代码实际上是在类方法中完成的(类是aNewViewController的同一类,它是结果页的视图控制器)。为了解决这个问题self,我试图设置一个局部变量第一

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

foo传入,并有self值)。那么它确实有效!但是如果它不是一个类方法但是一个实例方法会怎么样?self不会再存在吗? (如果它是在一个实例方法中,完成块是否保持对象存活?但是在完成块之后,谁让对象保持活动?)我在类方法中做了它,因为然后起始页可以调用这个类方法来呈现此页面(使用URL数据获取逻辑)。

+0

我很惊讶,这不会工作,因为你正在使用完成块。这在过去略有不同的情况下适用于我。 – Till

+0

哦,顺便说一下,解雇完成后,“自我”不再存在了吗?我实际上是在类方法中做这件事,并将'self'传递给这个类方法... –

回答

0

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

+0

为什么会这样呢,解除操作是1.完成时没有动画,并且2.完成块中完成了下面的呈现。 – Till

+0

所以如果我们需要0.4秒的延迟,使它在主循环的下一次迭代中运行将不起作用?是的,我也想知道为什么它需要这么大的延迟,0.4秒就像24次迭代的CADisplayLink已经 –

+0

@Rahul请在原始问题(和问题更新)下看到我的第二个评论 –

相关问题