访问 UITabBarController 的子视图控制器

Accessing child view controllers of a UITabBarController

我是 iOS 的新手,如何访问子视图控制器表单 UITabBarController?目前,我有以下内容。

  1. RequestTabBarController
  2. ActiveRequestsTableViewController
  3. RequestViewController

子视图控制器在故事板中使用 Relationship Segue 连接。我想在 UITabBarController 的子视图中设置一些属性。这是如何实现的。

故事板

创建 UITabBarController 的子类(对于您的情况可能是 ManageRequestTabBarController)并实现 UITabBarControllerDelegate:

public func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController)

当您点击任何选项卡项时以及转到与该选项卡项连接的 viewController 之前调用此委托。

这里viewController是目的地viewController。像这样使用它:

if viewController is YourDestinationVC {
    let yourDestinationVC = viewController as! YourDestinationVC
    yourDestinationVC.yourCustomValue = someValueYouWantToPass
}

根据您上面的描述,我了解到您想要访问 TabController 的子级以更改它们的某些属性。如果我的理解是正确的,那么您可以使用 UITabBarController 的 viewcontrollers 属性 来访问子项并设置属性。

如果您在情节提要中设置 UI,则可以在 UITabBarController 子类中实现 prepareForSegue。每 childViewController 被调用一次。要区分不同的 childViewControllers,您可以使用 segueIdentifiers 或检查 segues 的 destinationViewController 类型(假设每个 childViewController 都有不同的类型)。

您可以定义以下枚举来映射您的 类:

enum TabType:Int {
    case RequestTabBarController
    case ActiveRequestsTableViewController
    case RequestViewController
}

通过这种方式,您可以干净地访问您的 viewControllers:

An array of the root view controllers displayed by the tab bar interface.

您可以直接从 UITabBarController 中获取,这样做:

private weak var tabVc:UITabBarController?
var niceObject:Whatever?
//...//
override public func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.tabVc = segue.destination as? UITabBarController

    if let vc = self.tabVc?.viewControllers?[TabType.RequestTabBarController.rawValue] as? RequestTabBarController {
        vc.doWhatEver(niceObject)
    }
}