2017-04-04 11 views
3

StoryboardAppDelegateから複数のView Controllerをインスタンス化する方法は?

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

EDIT - あなたはUIViewControllerすることができます適切な子を設定するために、UIPageViewControllerを扱っている場合は、私がPagingViewController内(コンテナビュー)

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

通常、コンテナVCをどのように初期化していますか?それは 'didLaunchWithOptions'にありませんか? – dmorrow

+0

ちょっと、私の例にコードを追加しました。ありがとう – user7097242

+0

実際には、ContainerVCはストーリーボードで初期化されています。 – user7097242

答えて

0

を3つのVCをインスタンス化していますかの追加コード:

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

こんにちはフェリペ。私はUIPageViewControllerを使用していませんが、代わりに、V1、V2およびV3のコンテナビューを実行するPagingViewControllerというVCを使用しています。私はそこに3つのVcのすべてをインスタンス化します。私が追加した追加のコードを見て、可能であればそれに応じてコードを修正してください。助けてくれてありがとう!! – user7097242

関連する問題