簡體   English   中英

依賴注入UITabBarController子ViewControllers

[英]Dependency injection into UITabBarController child ViewControllers

我目前正在為iOS設置Tab Bar應用程序。

通常,我會在更改viewControllers時使用像prepareforSeque這樣的重寫方法進行依賴注入,但是當UITabBarController更改其活動子ViewController時,不會調用該方法。 如何正確地將依賴注入到UITabBarController子ViewControllers?

在RootViewController的viewDidLoad您可以通過childViewControllers進行迭代,找到所需的各種子控制器,並為每個子控制器設置依賴關系。 在這種情況下,依賴項將在子視圖控制器的viewDidLoad中可用。 選項卡欄實例化子視圖控制器實例,但在需要之前不加載視圖。

加載標簽欄視圖控制器后,您可以使用委托方法注入更新的依賴項並在viewDidAppear使用它,因為一旦在標簽欄中選擇了viewDidLoad它就不會被調用。

通過一些額外的研究,我得出了答案。 感謝Will-m提供我需要的線索。 這個答案的當前cavaet是由TabBarController加載的第一個視圖不會被注入。

要從UITabBarController將數據注入ViewControllers,您需要執行以下操作:

首先,您需要在加載時將RootViewController設置為自己的委托。

除非您需要將另一個類中所需的數據直接注入UITabBarController,否則您不一定需要將控制器類作為自己的委托。

您還需要將委托類聲明為符合UITabBarControllerDelegate協議。

// Declare UITabBarControllerDelegate protocol
class RootViewController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Set class delegate to self
        self.delegate = self
    }
}

您需要設置RootViewController的委托,因為委托的協議包含一個重要的方法:tabBarController(_:shouldSelectViewController :) 當RootViewController更改其活動選項卡時,將調用此方法。

tabBarController (_:shouldSelectViewController :)的“viewController”參數是TabBarController切換到的子ViewController的實例。 如果已為該ViewController分配了協議(以便編譯器知道您的變量是在類中聲明的),則可以將該變量注入到子級中。

所以將函數添加到RootViewController類中,如下所示:

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) {
    // Get your view controller using the correct protocol.
    // Use guard to make sure the correct type of viewController has been provided.
    guard let vc = viewController as? YourProtocol
        else { fatalError("wrong view controller type") }
    // Assign the protocol variable to whatever you want injected into the class instance.
    vc.VariableInYourProtocol = InjectedVariable
}

而已。 如果您需要支持不同協議的控制器,我可能會使用switch語句編寫一些內容。 這不是我現在需要合作的東西。

此外,作為注釋,此方法適用於CoreData實踐,其中只有一個managedObjectContext實例在活動ViewControllers之間傳遞。 使用此方法而不是直接從每個ViewController的應用程序委托檢索上下文的不同實例。

暫無
暫無

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

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