环境
iOS 9.2
Xcode 7.2
我希望用动画替换UIWindow 的 rootViewController ,同时也将其从视图层次结构中删除。
class FooViewController: UIViewController
{
}
class LeakedViewController: UIViewController
{
}
然后通过简单地在 AppDelegate 中启动转换
self.window!.rootViewController = LeakedViewController()
let fooViewController = FooViewController()
self.window!.rootViewController?.presentViewController(fooViewController, animated: true){ unowned let window = self.window!
window.rootViewController = fooViewController
}
在 Instruments 中对此进行分析,请注意 rootViewController 仍在内存中。
还遇到了这个错误报告,这似乎表明 iOS 8.3 中存在相同的问题并且仍然打开。
无法找到任何参考资料表明作为
UIViewController.presentViewController(animated:completion:)
源视图控制器被保留(很可能由UIPresentationController?)或者如果这是一个错误。请注意,UIPresentationController 最初是在 iOS 8 中引入的。
如果这是设计使然,是否有释放源视图控制器的选项?
使用 UIPresentationController 的子类
override func shouldPresentInFullscreen() -> Bool {
return true
}
override func shouldRemovePresentersView() -> Bool {
return true
}
似乎没有任何区别。无法在 SDK 中找到其他任何内容。
目前我发现的唯一方法是在进行转换之前使用 UIViewController 以及当前屏幕上的快照来代替根视图控制器。
let fooViewController = FooViewController()
let view = self.window!.snapshotViewAfterScreenUpdates(false)
let viewController = UIViewController()
viewController.view.addSubview(view)
self.window!.rootViewController = viewController
self.window!.rootViewController?.presentViewController(dashboardViewController!, animated: true){ unowned let window = self.window!
window.rootViewController = fooViewController
}
它确实有效,但在控制台中会出现以下警告
Unbalanced calls to begin/end appearance transitions for <UIViewController: 0x79d991f0>.
对原始问题或警告信息的任何想法表示赞赏。
更新
我相信我已将其范围缩小到缺少版本的保留。
那是可能的冒犯电话。
0 UIKit -[UIPresentationController _presentWithAnimationController:interactionController:target:didEndSelector:]