2017-04-04 83 views
3

Storyboard如何从AppDelegate实例化多个视图控制器?

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

问题是:由于我使用通用链接,用户直接进入playerView播放视频,但当他们按下完成按钮时,应用程序崩溃。我相信的问题是因为视图控制器上的其余部分未被初始化?我如何初始化容器视图和其他视图控制器?或者,如果这不是问题,请让我知道问题是什么。

下面是一些示例代码的应用程序委托。如有可能,请提供代码以帮助!

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    if let pagingViewController = window?.rootViewController as? PagingViewController { 
     pagingViewController.videoPlaybackManager = videoPlaybackManager 
    } 
    return true 
} 



    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 
    } 
} 

编辑 - 我如何实例里面PagingViewController 3级的VC(容器查看)

private func setupViewControllers() { 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 

     page1 = storyboard.instantiateViewController(withIdentifier: StoryboardIdentifiers.feedViewController.rawValue) as! FeedViewController 
     page1.view.translatesAutoresizingMaskIntoConstraints = false 
     page1.delegate = self 
     scrollView.addSubview(page1.view) 
     addChildViewController(page1) 
     page1.didMove(toParentViewController: self) 
     // Inject dependency. 
     page1.videoPlaybackManager = videoPlaybackManager 

     page2 = storyboard.instantiateViewController(withIdentifier: StoryboardIdentifiers.favoritesViewController.rawValue) as! FavoritesViewController 
     page2.view.translatesAutoresizingMaskIntoConstraints = false 
     page2.delegate = self 
     scrollView.addSubview(page2.view) 
     addChildViewController(page2) 
     page2.didMove(toParentViewController: self) 

     page3 = storyboard.instantiateViewController(withIdentifier: StoryboardIdentifiers.settingsViewController.rawValue) as! SettingsViewController 
     page3.view.translatesAutoresizingMaskIntoConstraints = false 
     scrollView.addSubview(page3.view) 
     addChildViewController(page3) 
     page3.didMove(toParentViewController: self) 
...... 
+0

你通常如何初始化Container VC?那不在'didLaunchWithOptions'中吗? – dmorrow

+0

嘿,我只是在我的示例中添加了更多的代码,显示了它的完成情况。谢谢 – user7097242

+0

实际上ContainerVC正在通过故事板进行初始化。 – user7097242

回答

0

如果你正在处理UIPageViewController,设置适当的儿童UIViewController可以附加代码:

// In PagingViewController 
func loadChildViewControllerFromUniversalLink(myParameter: Bool) { 
    // The condition you need to satisfied in order to present 
    // the correct child view controller 
    if myParameter { // is satisfied 
     let universalLinkVc = MyChildViewController() // load your VC here 
     let direction : UIPageViewControllerNavigationDirection = .forward // or .reverse, as you wish 
     self.setViewControllers([universalLinkVc], direction: direction, animated: animated, completion: nil) 
    } 
} 

然后在你的AppDelegateapplication(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool

myPagingViewControllerInstance.loadChildViewControllerFromUniversalLink(true) 
+0

你好Felipe。我没有使用UIPageViewController,而是使用一个名为PagingViewController的VC,它用作V1,V2和V3的容器视图。然后我在那里实例化所有3 Vc。请看看我添加的附加代码,如果可能,相应地修改您的代码。谢谢您的帮助!! – user7097242

相关问题