如何从 AppDelegate 实例化 UIViewController?
Posted
技术标签:
【中文标题】如何从 AppDelegate 实例化 UIViewController?【英文标题】:How to instantiate a UIViewController from AppDelegate? 【发布时间】:2017-04-04 03:23:12 【问题描述】:我的应用中有以下设置:
有一个包含 3 个视图控制器(A、B 和 C)的容器视图。我可以通过向左或向右滑动来从 A、B 或 C 切换。 A 或 B 都包含自己的集合视图。如果我在 A 或 B 内的集合视图中点击任何单元格,PlayerVC(上图中名为 Player ^^)就会启动并开始使用 AVPlayer
播放视频。
问题是:
此应用可以分享Universal Links
,因此当用户点击universal link
时,它会将他们直接带到应用,启动PlayerVC
,然后开始播放视频。问题是如果用户在点击universal link
时被直接带到PlayerVC
,我该如何初始化其他视图控制器?或者如何从app delegate
到PlayerVC
?
这里有一些场景:
如果用户被直接带到PlayerVC
,那么如果他们关闭PlayerVC
,应用程序就会崩溃。
如果应用程序已经启动但处于后台模式,假设用户在view controller B
,那么当用户点击universal link
时,我如何从view controller B
转到PlayerVC
?李>
这是app delegate
中的委托方法,当用户点击universal link
时会调用该方法(请注意HELP
注释):
class AppDelegate: UIResponder, UIApplicationDelegate
// Other App Delegate methods.....
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool
// 1) Make sure the passed `user activity` has expected characteristics.
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL else
return false
// HELP: I need to get to `PlayerVC` from here?
return true
// If we can't do the above we default to opening the page in safari
注意: 我们的应用正在运行 ios 10。我们正在使用 Apple 的通用链接新 api:https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html
有什么想法吗?
【问题讨论】:
【参考方案1】:问题是:
此应用能够共享通用链接,因此当用户点击 通用链接,它将他们直接带到应用程序,启动 PlayerVC,并开始播放视频。问题是我该怎么做 如果用户被直接带到,则初始化其他视图控制器 PlayerVC 如果他们点击通用链接?或者如何到达 来自应用委托的 PlayerVC?
对于这个问题,您需要先实例化容器及其子视图控制器,然后才能显示 PlayerVC
如果用户被直接带到 PlayerVC,那么如果他们关闭 应用程序崩溃的 PlayerVC。
按照我告诉你的实现,它不应该崩溃。总会有一个容器控制器被实例化
如果应用已经启动但处于后台模式,假设 用户在视图控制器 B 中,然后当用户点击通用 链接,如何从视图控制器 B 转到 PlayerVC?
您可以在 AppDelegate 中存储容器控制器的全局变量。有了这个你可以访问控制器B。然后你可以调用
container.present(playerVC, animated: true, completion: nil)
【讨论】:
嘿,感谢 cmets。我将如何根据我的问题来实例化容器及其子视图控制器?你能提供一个代码示例吗?谢谢以上是关于如何从 AppDelegate 实例化 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章
Xcode & Swift - 无法从 AppDelegate 实例化另一个视图控制器
使用 AppDelegate 中的 Storyboard 以编程方式实例化视图控制器
如何在不使用 Nib 的情况下实例化和调用 UIView 子类
如何使用没有选项卡或导航控制器的故事板从 AppDelegate 实例化不同的视图?