如何正确删除SFSafariViewController作为子视图控制器?

Joe*_*ang 11 ios childviewcontroller swift sfsafariviewcontroller

我正在使用这个SO答案提供的技术在SFSafariViewController中预加载一些URL,如下所示:

addChildViewController(svc)
svc.didMoveToParentViewController(self)
view.addSubview(svc.view)
Run Code Online (Sandbox Code Playgroud)

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

svc.willMoveToParentViewController(nil)
svc.view.removeFromSuperview()
svc.removeFromParentViewController()
Run Code Online (Sandbox Code Playgroud)

现在我可以预加载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
Run Code Online (Sandbox Code Playgroud)

我在删除Safari View控制器时是否正确执行此操作?我错过了什么吗?或任何解决此问题的建议?

Pra*_*p K 1

如果您添加子视图控制器代码如上面指定的那样,那么我认为它的顺序应该与文档有所不同。

\n
addChildViewController(svc)\nview.addSubview(svc.view)\nsvc.didMoveToParentViewController(self)\n
Run Code Online (Sandbox Code Playgroud)\n

您应该首先添加子视图,然后调用 didMoveToParentViewController。试试这个,看看是否有效。

\n
\n

清单 5-1 将子视图控制器添加到容器中

\n
    \n
  • (void) displayContentController: (UIViewController*) content { [self addChildViewController:content]; content.view.frame = [self\nframeForContentController]; [self.view\naddSubview:self.currentClientView]; [内容\ndidMoveToParentViewController:self]; }
  • \n
\n

在前面的示例中,请注意您仅调用子级的\ndidMoveToParentViewController: 方法。这是因为 addChildViewController: 方法会为您调用 childxe2x80x99snwillMoveToParentViewController: 方法。您必须自己调用 didMoveToParentViewController: 方法的原因是,在将子视图\xe2\x80\x99s 视图\n嵌入到容器\xe2\x80\x99s 视图层次结构中之前,\n无法调用该方法。

\n
\n