在我的 TabBarViewController 中,如何为 viewDidLoad 上的每个子视图控制器设置一个实例变量?

In my TabBarViewController, how can I set an instance variable to every child view controller on viewDidLoad?

var messageViewController: MessageViewController?
var settingsViewController: SettingsViewController?
var otherViewController: OtherViewController?
override func viewDidLoad() {
   messageViewController = //the first one
   settingsViewController = //the second one
   otherViewController = //the third one
}

然后在代码的后面,我可以在需要的时候调用那些控制器中的方法。

messageViewController.reloadData()

您必须使用 delegate protocol 通过 different View Controllers 发送变量或调用方法。我已经在另一个 post 中回答了这个问题,所以请查看我的回答以了解如何做到这一点:

.

试试这个,

let firstViewController = self.viewControllers![0] as FirstViewController
let secondViewController = self.viewControllers![1] as SecondViewController

等等..

UITabBarControllerviewControllers 属性 是对每个内容视图控制器的引用数组。如果您确切知道每个索引处的控制器,您可以从这个数组中分配变量:

override func viewDidLoad() {
    super.viewDidLoad()
    messageViewController = viewControllers![0] as! MessageViewController
    settingsViewController = viewControllers![1] as! SettingsViewController
    otherViewController = viewControllers![2] as! OtherViewController
}

或者甚至使变量计算属性:

var messageViewController: MessageViewController { return viewControllers![0] as! MessageViewController }
var settingsViewController: SettingsViewController { return viewControllers![1] as! SettingsViewController }
var otherViewController: OtherViewController { return viewControllers![2] as! OtherViewController }

另一种解决方案(取决于您的需要)是实现一个(调用 reloadData 的人)到多个(所有视图控制器)的关系。完成此操作的最简单方法是通过通知。您可以阅读更多关于它们的信息 here

通过这种方式,您的 tabBar 不必知道它的子 public 方法,而且也不关心谁在监听它的通知(它甚至可能是 tableview、cell 或其他)。