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

3

Storyboard

有一个容器视图,其中包含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)
......

你通常是如何初始化容器VC的?难道不是在 didLaunchWithOptions 中吗? - dmorrow
嘿,我刚刚添加了更多代码到我的示例中,展示了如何完成。谢谢。 - user7097242
实际上,ContainerVC是通过storyboards进行初始化的。 - user7097242
1个回答

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

在你的AppDelegate中的`application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool`方法中:
myPagingViewControllerInstance.loadChildViewControllerFromUniversalLink(true)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接