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

8
我有四个视图,每个视图都有一个头部部分,我将这些部分外包到一个 containerview 中,以便在所有四个视图上使用相同的字段和布局。在我的容器内部,我有很多标签,现在我想要用数据填充这些标签。我的问题现在是,我必须根据用户选择的游戏来填充标签。游戏是我的玩家类中的一个枚举。我不知道如何从我的 containerview 内部获得该信息并设置游戏变量,以执行我的代码。是否有一种方法可以从包含 containerview 的视图中获取 storyboardid?

切换游戏

case .Coinflip:

Player1PointsLabel.Text = (player1.points.coinflip)

case .RollingDices

Player1PointsLabel.Text = (player1.points.rollingdices)


也许我在设计方面做错了什么,因为我还没有那么多经验,所以我也希望能得到建议。

此致敬礼

3个回答

17
据我所知,获取被插入到 ContainerView 中的视图的 ViewController 的唯一方法是在实例化 ContainerView 时,在父 ViewController 中保存对它的引用。 Swift 4 示例: 如果您在故事板中使用了 ContainerView 并添加了一个嵌入式 segue:
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 中插入了一个 View:

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
}

4

您的问题目标不是很清晰。

如果您想访问视图(包含子视图的视图)的父视图,则请使用“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
}

1

实现主控制器的prepareForSegue方法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接