在调查内存泄漏时,我发现了一个与setRootViewController:
在转换动画块中调用技术相关的问题:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
Run Code Online (Sandbox Code Playgroud)
如果旧视图控制器(正在替换的视图控制器)当前正在呈现另一个视图控制器,则上述代码不会从视图层次结构中删除呈现的视图.
也就是说,这一系列操作......
transitionWithView:
使Z中的新根视图控制器...对用户看起来没问题,但Debug View Hierarchy工具将显示Y的视图仍然在Z的视图后面,在a UITransitionView
.也就是说,在上面的三个步骤之后,视图层次结构是:
我怀疑这是一个问题,因为在转换时,X的视图实际上不是视图层次结构的一部分.
如果我dismissViewControllerAnimated:NO
之前发送到X transitionWithView:
,则生成的视图层次结构为:
如果我向dismissViewControllerAnimated:
X 发送(是或否),然后在completion:
块中执行转换,则视图层次结构正确.不幸的是,这会干扰动画.如果动画解雇,那就浪费时间; 如果没有动画,它看起来很破碎.
我正在尝试其他一些方法(例如,创建一个新的容器视图控制器类作为我的根视图控制器),但没有找到任何有效的方法.我会去的时候更新这个问题.
最终目标是直接从呈现视图转换到新的根视图控制器,而不会留下杂散视图层次结构.