我不喜欢使用这些,但您可以通过访问数组 childViewControllers 从父控制器获取子视图控制器。在视图确实加载时,您需要遍历所有这些并找到可以类型转换为您的视图控制器类型的一个,例如
childViewControllers.flatMap { $0 as? AViewController }.first。
既然您找到了正确的视图控制器,我建议您将自己指定为委托人
childViewControllers.flatMap { $0 as? AViewController }.first.delegate = self
或者只是添加一个按钮目标
childViewControllers.flatMap { $0 as? AViewController }.first.button.addTarget...
现在,如果您简单地同时嵌入 2 个视图控制器(有 2 个内容视图)并根据您显示的内容隐藏一个或另一个,则可以轻松完成此操作。至少通过这种方式,您可以立即分配连接。如果不是这种情况,那么您将需要在设置新控制器或分配初始化新视图控制器的连接时再次迭代。
在这种情况下,似乎最好扭转系统:加载子视图控制器时,而不是调用
self.delegate = parentViewController as? AViewControllerDelegate
虽然这可行,但子视图控制器控制其侦听器的身份似乎是错误的,因此我建议您避免此类编码。
我通常为容器视图使用自定义实现,您可以执行相同的操作,或者至少子类化原生视图并定位方法,以便您的代码看起来像:
private onBPressed() {
containerView.setViewController(viewController: BViewController(delegate: self), animation: .fade)
}