从 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
}
我确实有 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
}