在iOS上,为什么取消显示视图控制器紧接着又呈现另一个视图控制器会出现问题?

3

之前有效的代码如下:

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

而且,selfaNewViewController 是同一个类,因此它是一个不停呈现新页面(使用不同数据)的页面,通过水平翻转来实现。

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

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

但出现了问题,它只会“返回”到之前的视图控制器视图,而不去到新的视图控制器(aNewViewController)。 最初,我将上述代码放在2个平行的线路中,其中一个跟着另一个,然后我将第二行放在第一个调用的完成块中。这两种方法都不能按预期工作。是否有什么棘手的事情使它不能转到新的视图控制器?
另外,它曾经有将内容翻转到新页面的好效果,但是现在,如果它工作,它可能会翻转回第一页(起始页),然后翻转到结果页,下一次,再次翻转到起始页。因为起始页与结果页看起来非常不同,我更希望它继续翻转显示结果页(从一个结果页翻转到另一个结果页)。如果我将“关闭”设置为没有动画,它将没有翻转动画,但它仍然会先显示起始页,然后翻转到结果页。有没有办法解决这个问题?
更新:难道不是self在退出后就不复存在了吗? (对象已dealloc'ed)。 上述代码实际上是在一个类方法中完成的(该类是aNewViewController的相同类,即结果页的视图控制器)。 为了解决self问题,我首先尝试设置一个本地变量。
UIViewController *presentingViewController = foo.presentingController;
[presentingViewController dismissViewControllerAnimated:NO 
          completion:^{
              [presentingViewController 
                        presentViewController:aNewViewController
                        animated:YES completion:nil];
}];

(foo被传递进来,它的值为self)。如果它是一个类方法,那么它实际上是可以工作的!但如果它不是一个类方法而是一个实例方法...那么self就不存在了吗?(如果它在一个实例方法中,那么完成块会保持对象的生命力吗?但是在完成块之后,谁会保持对象的生命力?)我这样做是因为在一个类方法中,页面可以直接调用此类方法来呈现此页面(带有URL数据获取逻辑)。

我很惊讶这个不起作用,因为你正在使用完成块。在稍微不同的情况下,这对我有用过。 - Till
哦,顺便问一下,当 dismiss 完成后,self 就不存在了,对吧?我实际上是在一个类方法中执行这个操作,并将 self 传递给这个类方法... - nonopolarity
1个回答

0

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


为什么这样做,因为dismiss操作1.没有动画,2.接下来的presenting是在completion block中完成的。 - Till
所以,如果我们需要0.4秒的延迟,让它在主循环的下一次迭代中运行就不起作用了吗?是的,我也想知道为什么需要这么长时间的延迟,0.4秒已经相当于CADisplayLink的24次迭代了。 - nonopolarity
@Rahul,请查看我在原问题下的第二个评论(以及问题中的更新)。 - nonopolarity
为什么要使用同一个视图控制器?你可以在视图本身上完成这个操作。比如,你可以在self.view上进行翻转动画,并在viewController中更改数据,然后根据数据更新视图。我认为目前的做法是不好的实践。 - Rahul Vyas
这是因为如果页面可以从这个数据页面转到“新成员”页面或“热门话题”页面,我们会呈现其他类型页面的视图控制器,当这些页面需要跳转到任何数据页面时,再展示此视图控制器。 - nonopolarity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接