如何正确地将SFSafariViewController从子视图控制器中移除?

11

我正在使用这个SO答案提供的技术来像这样预加载一些URL到SFSafariViewController中:

addChildViewController(svc)
svc.didMoveToParentViewController(self)
view.addSubview(svc.view)

我尝试使用以下代码移除Safari View控制器:

svc.willMoveToParentViewController(nil)
svc.view.removeFromSuperview()
svc.removeFromParentViewController()

现在我可以预加载URL并且无问题地显示Safari视图。但是,如果我重复这个过程(预加载/显示/删除)多次(可能超过30次),应用程序将由于某些内存问题而崩溃,因为日志显示Memory level is not normal or this app was killed by jetsam当应用程序崩溃时。

在崩溃之前,我看到了一些可能泄漏的警告日志:

<Warning>: notify name "UIKeyboardSpringBoardKeyboardShow" has been registered 20 times - this may be a leak

<Warning>: notify name "com.apple.SafariViewService-com.apple.uikit.viewService.connectionRequest" has been registered 20 times - this may be a leak

我在移除 Safari 视图控制器时做得对吗?有什么我错过的东西吗?或者有什么建议可以解决这个问题吗?

2个回答

1
如果您添加子视图控制器的代码与上述指定的代码相同,则我认为根据文档,它的顺序应该有所不同。
addChildViewController(svc)
view.addSubview(svc.view)
svc.didMoveToParentViewController(self)

你应该先添加子视图,然后再调用didMoveToParentViewController方法。尝试这样做,看看是否有效。
代码清单5-1:将子视图控制器添加到容器中
(void)displayContentController:(UIViewController *)content { [self addChildViewController:content]; content.view.frame = [self frameForContentController]; [self.view addSubview:self.currentClientView]; [content didMoveToParentViewController:self]; }
在上面的示例中,请注意只调用了子项的didMoveToParentViewController:方法。这是因为addChildViewController:方法已经为您调用了子项的willMoveToParentViewController:方法。必须自己调用didMoveToParentViewController:方法的原因是,在将子项的视图嵌入容器的视图层次结构之后才能调用该方法。

尝试了建议的顺序,但仍然存在相同的问题。 - Joe Huang
你能否使用WKWebkitView并将其作为子视图添加到主VC中,而不是使用SVC? - Pradeep K
你能把整个代码或者演示这个问题的样例原型发给我进行测试吗? - Pradeep K

1

你可能正在泄露svc。在移除它后将其设置为nil

svc.willMoveToParentViewController(nil)
svc.view.removeFromSuperview()
svc.removeFromParentViewController()
svc = nil

如果这不能解决问题,尝试启用僵尸或使用泄漏检测工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接