如何从 viewController 的视图中呈现 UIViewController

Posted

技术标签:

【中文标题】如何从 viewController 的视图中呈现 UIViewController【英文标题】:How to present UIViewController from viewController's view 【发布时间】:2017-11-10 22:49:49 【问题描述】:

我在UIViewController 中使用UITableViewController 的视图,如下所示:

UITableViewController *tvc = [[UITableViewController alloc] init];
[self.view addSubview:tvc.view];

现在,在这个UITableViewController 中,我希望能够在必要时提供一个SFSafariViewController。我写了下面的代码:

if (showLink) 
    SFSafariViewController *sfsvc = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"https://www.google.com"]];
    [self.presentingViewController.navigationController pushViewController:sfsvc animated:YES];

每当我运行此程序时,我都会在控制台中收到以下错误,但什么也没有发生:

[Warning] Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<SFSafariViewController: 0x7f8aef82a600>)

有什么办法可以解决这个问题吗?

【问题讨论】:

你为什么不直接使用UITableView 而不是破解UITableViewController?你的问题是你的 safari 视图控制器是一个局部变量,一旦这个函数退出它就会被释放,大概是因为没有任何东西保留你的 tableviewcontroller 【参考方案1】:

在这种情况下,使用rootViewController 推送SFSafariViewController 是您的解决方案。在下面试试我的代码

if (showLink) 
    SFSafariViewController *sfsvc = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"https://www.google.com"]];
    UIViewController *rootViewController = UIApplication.sharedApplication.delegate.window;
    [rootViewController.navigationController pushViewController:sfsvc animated:YES];

【讨论】:

以上是关于如何从 viewController 的视图中呈现 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

从 SubView 呈现模态 ViewController

您将如何从子视图中呈现ViewController?

iPhone,iOS 8:如何呈现比原始视图控制器更小的 ViewController?

swift3:如何将 xib 呈现给 viewcontroller

关闭从 UIDocumentInteractionController 打开的 iOS 邮件应用程序会删除 iOS7 中呈现的 ViewController 的视图

如何从使用的 viewController 弹回根 ViewController?