簡體   English   中英

如何從AppDelegate實例化UIViewController?

[英]How to instantiate a UIViewController from AppDelegate?

我的應用程序中具有以下設置: 故事板設置

有一個容器視圖,其中包含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
    }
}

注意:我們的應用程序運行的是iOS10。我們將Apple的新API用於通用鏈接: https : //developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html

有什么想法嗎?

問題是:

該應用程序可以共享通用鏈接,因此當用戶點擊通用鏈接時,它將直接將其帶到該應用程序,啟動PlayerVC,然后開始播放視頻。 問題是,如果用戶點擊通用鏈接直接將他們帶到PlayerVC,我如何初始化其他視圖控制器? 還是如何從應用程序委托獲取PlayerVC?

對於此問題,您需要首先實例化容器及其子視圖控制器,然后可以顯示PlayerVC

如果將用戶直接帶到PlayerVC,則如果他們關閉了PlayerVC,則應用程序將崩潰。

使用我告訴您的實現,它不會崩潰。 總是會有一個實例化的容器控制器

如果該應用已經啟動但處於后台模式,則假設用戶在視圖控制器B中,那么當用戶點擊通用鏈接時,如何從視圖控制器B轉到PlayerVC?

您可以在您的AppDelegate中存儲容器控制器的全局變量。 這樣您就可以訪問控制器B。然后您可以呼叫

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM