从 containerView,如何访问包含 Swift 中容器的视图控制器?

From a containerView, how do you access the view controller containing the container in Swift?

我确实有 4 个带有页眉部分的视图,我将其外包到容器视图中,以便在所有 4 个视图上具有相同的字段和布局。在我的容器中,我有很多标签,我知道这些标签需要填充数据。我现在的问题是,我必须根据用户选择的游戏相应地填写标签。游戏是我的播放器 class 中的一个枚举。我不知道如何从我的 containerview 中获取该信息并相应地设置游戏变量以执行我的代码。有没有解决方案可以从我的 containerview 所在的视图中获取 storyboardid?


切换游戏

案例.Coinflip:

Player1PointsLabel.Text = (player1.points.coinflip)

案例.RollingDices

Player1PointsLabel.Text = (player1.points.rollingdices)


也许我做错了什么,设计明智,我还没有那么有经验,所以我也愿意接受建议。

此致

你提问的目的不是很明确

如果您想访问视图的父视图(包含子视图的视图),请使用 'myView.superview'。

如果您想访问承载您的 UIViewController 的 UIViewController,请使用 'myViewController.presentingViewController'。

最后,如果你想访问托管视图的 UIViewController,你必须遍历响应链,直到到达第一个 UIViewController 或链的末尾(UIView 是 UIResponder 的子类):

func viewController(forView: UIView) -> UIViewController? {
  var nr = forView.next
  while nr != nil && !(nr! is UIViewController) {
    nr = nr!.next
  }
  return nr as? UIViewController
}

实现主控制器的prepareForSegue方法。

根据 segue 名称,您可以创建对 destination 控制器的引用,管理容器视图

据我所知,获取插入到 ContainerView 的视图的 ViewController 的唯一方法是在 ContainerView 时在父 ViewController 中保存对它的引用被实例化。

Swift 4个例子:

如果您在故事板中使用了 ContainerView 并添加了嵌入转场:

var containerVC: UIViewController?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "YourEmbedSegueName" {
        if let vc = segue.destination as? YourViewController {
            self.containerVC = vc
        }
    }
}

或者,如果您以编程方式在 ContainerView 中插入一个视图:

var containerVC: UIViewController?
func customContainerEmbed(vc: UIViewController) {
    self.addChildViewController(vc)
    yourContainer.addSubview(vc.view)
    vc.view.frame = yourContainer.bounds
    vc.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    vc.didMove(toParentViewController: self)

    self.containerVC = vc
}