在调查内存泄漏时,我发现了一个与在过渡动画块内调用setRootViewController:
的技术相关的问题:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
如果旧的视图控制器(被替换的视图控制器)当前正在呈现另一个视图控制器,那么上面的代码不会从视图层次结构中删除所呈现的视图。
也就是说,这一系列的操作...
- X成为根视图控制器
- X代表Y,因此Y的视图显示在屏幕上
1.使用transitionWithView:
使Z成为新的根视图控制器
......在用户看来没有问题,但是Debug View Hierarchy工具将显示Y的视图仍然在Z的视图后面,在UITransitionView
中。也就是说,在上述三个步骤之后,视图层次为:
- UI窗口
- UI转换视图
- UI视图(Y的视图)
- UI视图(Z视图)
我怀疑这是一个问题,因为在转换时,X的视图实际上并不是视图层次结构的一部分。
如果我在transitionWithView:
之前发送dismissViewControllerAnimated:NO
到X,则得到的视图层次结构为:
- UI窗口
- UI视图(X的视图)
- UI视图(Z视图)
如果我发送dismissViewControllerAnimated:
(YES或NO)到X,然后在completion:
块中执行转换,那么视图层次是正确的,不幸的是,这会干扰动画,如果动画消除,会浪费时间;如果不设置动画,它看起来会损坏。
我尝试了一些其他的方法(例如,创建一个新的容器视图控制器类作为我的根视图控制器),但是没有找到任何有效的方法。
最终目标是直接从当前视图转换到新的根视图控制器,而不留下分散的视图层次结构。
5条答案
按热度按时间kmynzznz1#
有一个类似的问题。在我的例子中,我有一个视图控制器层次结构,其中一个子视图控制器有一个显示视图控制器。当我改变windows根视图控制器时,由于某种原因,显示视图控制器仍然在内存中。所以,解决方案是在我改变windows根视图控制器之前,先关闭所有视图控制器。
yc0p9oo02#
我在使用此代码时遇到此问题:
禁用这段代码,修复了这个问题。我设法让这个工作,只有启用这个过渡动画时,得到动画的过滤器条是初始化。
这并不是你真正要寻找的答案,但它可以为你找到正确的解决方案。
yvt65v4c3#
我最近遇到了一个类似的问题。我不得不手动从窗口中删除那个
UITransitionView
来修复这个问题,然后在以前的根视图控制器上调用dismiss来确保它的解除分配。修复不是真的很好,但除非你找到了一个更好的方法,因为张贴的问题,这是唯一的事情,我发现工作!
viewController
只是newController
从你原来的问题。雨燕3.0
(See其他Swift版本的编辑历史记录)
作为
UIWindow
上的一个扩展,允许传入一个可选的转换,这是一个更好的实现。用法:
或者
xnifntxz4#
这个问题困扰了我一整天,我尝试了@Rich的obj-c解决方案,结果发现当我想再显示一个视图控制器时,会被一个空的UITransitionView阻塞。
最后,我想出了这个办法,它对我很有效。
好了,现在您要做的就是在切换根视图控制器时调用
[self setRootViewController:newViewController];
。83qze16e5#
我尝试了一个简单的事情,为我工作的iOs 9.3:只需在
dismissViewControllerAnimated
完成期间从层次结构中删除旧viewController的视图。让我们按照benzado的说明处理X、Y和Z视图:
也就是说,这一系列的操作...
1.使用带有视图的过渡:使Z成为新的根视图控制器
给予:
在我的例子中,X和Y都很好地解除了分配,它们的视图不再处于层次结构中!