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

Ios 在我的TabBarViewController中,如何为viewDidLoad上的每个子视图控制器设置实例变量?,ios,swift,model-view-controller,Ios,Swift,Model View Controller,然后在以后的代码中,我可以在需要时调用这些控制器中的方法 var messageViewController: MessageViewController? var settingsViewController: SettingsViewController? var otherViewController: OtherViewController? override func viewDidLoad() { messageViewController = //the first one

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

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()

依此类推。

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

let firstViewController = self.viewControllers![0] as FirstViewController
let secondViewController = self.viewControllers![1] as SecondViewController
或者甚至使变量具有计算属性:

override func viewDidLoad() {
    super.viewDidLoad()
    messageViewController = viewControllers![0] as! MessageViewController
    settingsViewController = viewControllers![1] as! SettingsViewController
    otherViewController = viewControllers![2] as! OtherViewController
}
另一个解决方案(取决于您的需要)是实现一对多(所有视图控制器)关系(无论谁调用reloadData)。实现这一点的最简单方法是通过通知。你可以阅读更多关于他们的信息


通过这种方式,您的选项卡栏不必知道它的子公共方法,而且也不关心谁在侦听它的通知(它甚至可能是tableview、cell或其他任何形式)。

我认为他们不想从视图控制器传回变量,相反,他们希望将每个内容视图控制器分配给选项卡栏控制器中的一个变量;你想用“as”吗为了强制向下播放?然后,当我提出建议并添加感叹号时,
var lobbyVC:LobbyViewController{return viewControllers[0]as!LobbyViewController}
,错误是:
不能用“Int”类型的索引下标“[AnyObject]”类型的值。
@TIMEX抱歉,我已经更正了一些错误。
viewControllers
数组是可选的,但是如果您正确创建了选项卡栏,它将不会是
nil
,因此您可以使用
强制展开它。您还必须强制转换到相应的视图控制器类,因为传统原因
viewControllers
是一个
AnyObject
s的数组!你认为我需要和代表们打交道吗?或者,当我想从这些VCs调用方法时,这种方法足够好吗?如果您只想根据选项卡栏控制器中接收到的信息调用内容视图控制器上的方法(例如,选项卡栏控制器知道任何/所有内容何时需要更新,因此它会告诉其子VCs),则不需要委托。如果角色颠倒,我会开始考虑委托,这样子VC会收到一些信息,需要告诉父VC(选项卡栏),以便它可以对其采取行动。委派是关于向上传递信息,向下传递信息可以通过调用属性上的方法来完成。
var messageViewController: MessageViewController { return viewControllers![0] as! MessageViewController }
var settingsViewController: SettingsViewController { return viewControllers![1] as! SettingsViewController }
var otherViewController: OtherViewController { return viewControllers![2] as! OtherViewController }