在 iOS 上,为啥在当前视图控制器之后立即关闭视图控制器不起作用?
Posted
技术标签:
【中文标题】在 iOS 上,为啥在当前视图控制器之后立即关闭视图控制器不起作用?【英文标题】:On iOS, why would a dismiss view controller immediately followed by a present view controller not work?在 iOS 上,为什么在当前视图控制器之后立即关闭视图控制器不起作用? 【发布时间】:2012-09-26 10:58:38 【问题描述】:以前可以工作的代码是
[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 数据获取逻辑)。
【问题讨论】:
我很惊讶这不起作用,因为您正在使用完成块。过去,这对我有用,但情况略有不同。 哦,顺便说一句,当解雇完成后,self
不是真的不复存在了吗?我实际上是在类方法中执行此操作,并将self
传递给此类方法...
【参考方案1】:
您需要在这两个转换之间添加一些延迟。尝试添加 0.40 的交易量。赞[self performSelector:@selector(anySelector:) withObject:nil afterDelay:0.40];
【讨论】:
为什么会这样,dismiss动作是1.没有动画完成2.下面的呈现是在completion block内完成的。 所以如果我们需要 0.4 秒的延迟,让它在主循环的下一次迭代中运行是行不通的?是的,我也想知道为什么它需要这么大的延迟,0.4 秒就像 CADisplayLink 的 24 次迭代已经 @Rahul 请参阅我在原始问题下的第二条评论(以及问题中的更新) 为什么你使用相同的视图控制器?您可以在视图本身上执行此操作。就像您可以在 self.view 上制作翻转动画并更改 viewController 中的数据并据此更新视图一样。在我看来,目前的做法是不好的做法。 那是因为如果页面可以从这个数据页面到一个“新成员”页面,或者“热门话题”页面,我们会呈现其他页面类型的视图控制器,并且当这些页面需要跳转到任何数据页面,然后呈现这个视图控制器。以上是关于在 iOS 上,为啥在当前视图控制器之后立即关闭视图控制器不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
iOS 8 – 在设置关键窗口或关闭并立即呈现另一个视图控制器后快速呈现视图控制器时出现故障
为啥 websocket 在使用代码 1000 响应本机打开后立即关闭。(iOS)
为啥在 iOS 13 中的 textfieldBeginEditing 之后立即调用 textfieldDidEndEditing?在 iOS 较低版本中运行良好