3

曾经有效的代码是

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

self是同一个类aNewViewController,所以它是一个通过水平翻转不断呈现新页面(具有不同数据)的页面。

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

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

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

还有,以前翻到新内容的效果不错,但是现在,如果有效的话,大概会翻回第一页(起始页),然后再翻到结果页,下一次,再次翻到起始页。因为起始页面看起来与结果页面完全不同,我宁愿它只是继续翻转显示结果页面(从一个结果页面,翻转到另一个结果页面)。如果我将“关闭”设置为没有动画,它不会有翻转动画,但它仍然会先显示起始页面,然后再翻转到结果页面。有没有办法解决这个问题?

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

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

(foo被传入,并且具有self) 的值。然后它真的有效!但是,如果它不是类方法而是实例方法……将self不再存在怎么办?(如果是在实例方法中,完成块会让对象保持活动状态吗?但是在完成块之后,谁让对象保持活动状态呢?)我在类方法中做到了,因为这样起始页面就可以调用它呈现此页面的类方法(带有 URL 数据获取逻辑)。

4

1 回答 1

0

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

于 2012-09-26T11:05:11.117 回答