[英]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.