2017-04-04 78 views
0

我在我的应用中的以下设置: Storyboard setup如何从AppDelegate实例化UIViewController?

有保持3个视图控制器(A,B和C)的容器图。我可以通过向左或向右滑动来从A,B或C切换。 A或B都包含它们自己的集合视图。如果点击A或B内的收藏视图中的任何单元格,PlayerVC(上图中的名为Player的播放器)将启动,并且视频开始使用AVPlayer播放。

的问题是:

  • 这个程序是能够分享Universal Links所以当用户点击一个universal link,它直接将他们的应用程序,启动PlayerVC,并开始播放视频。问题是如何初始化其他视图控制器,如果用户被直接带到PlayerVC,如果他们点击universal link?或者如何从app delegatePlayerVC

这里是一些假设:

  • 如果用户直接带到PlayerVC,那么如果他们解雇PlayerVC应用程序崩溃。
  • 如果应用程序已经启动,但在后台模式下,假设用户在view controller B,那么当用户点击universal link时,我该如何从view controller BPlayerVC

这是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。我们正在为Universal Links使用Apple的新api:https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html

有什么想法?

回答

0

的问题是:

这个程序是可以共享通用链接,这样当用户点击一个 通用链路上,需要他们直接到应用程序,启动 PlayerVC,并开始打视频。问题是如果我们 初始化其他视图控制器,如果用户被直接带到 PlayerVC,如果他们点击一个通用链接?或如何从应用程序代理到 PlayerVC?

对于这个问题,你需要先初始化容器及其子视图控制器,那么你就可以显示PlayerVC

如果用户直接带到PlayerVC,那么如果他们解雇 PlayerVC应用程序崩溃。

随着我告诉你的实现,它不应该崩溃。总有会是一个容器控制器实例

如果应用程序已经启动,但在后台模式,让我们假设 用户在视图控制器B,那么当用户点击一个普遍 链接,怎么办我从视图控制器B到PlayerVC?

您可以在您的AppDelegate中存储容器控制器的全局变量。有了这个,你可以访问控制器B.那么你可以打电话

container.present(playerVC, animated: true, completion: nil) 
+0

嘿谢谢你的意见。基于我的问题,我将如何去实例化容器及其子视图控制器?你能提供一个代码示例吗?谢谢 – JEL