访问容器视图子属性Swift

29

我想要实现的目标:

用户在ViewController中按下按钮,然后容器视图中放置的按钮的颜色应更改为红色。

如何从ViewController中获取放置在容器视图中的按钮的访问权?

输入图片描述

4个回答

62

一步一步:

  1. 给你的视图控制器和容器视图控制器命名一个segue。
  2. 在你的视图控制器中添加一个属性,这个属性将包含容器视图控制器。
  3. 在你的视图控制器中实现一个方法prepareForSegue(_:sender:)
  4. 在这个方法中检查segue.identifier是否等于你在步骤1中指定的标识符。
  5. 如果是,那么将segue.destinationViewController保存到步骤2中的属性中。
  6. 现在,容器视图控制器已经存储在你的属性中了,所以你可以从你的类中进行自定义。你应该已经在viewDidLoad()方法中存储了视图控制器。

示例:

var containerViewController: YourContainerViewControllerClass?
let containerSegueName = "testSegue"
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == containerSegueName {
        containerViewController = segue.destinationViewController as? YourContainerViewControllerClass
    }
}

非常感谢您详细的回答,但我想知道在哪里可以编辑MyButton.backgroundColor = UiColor.blackColor()这一行代码?另外,如何在我的视图控制器中为按钮的动作添加一个override函数呢? - Tom el Safadi
在您的视图控制器中(而不是容器视图控制器),使用 containerViewController.MyButton.backgroundColor.. - sunshinejr
没错,对我有用,非常感谢你详细的回答!! - Tom el Safadi
1
太棒了!非常感谢你! - Stefan DeClerck
3
否则,如果不使用 override func prepare(for segue: UIStoryboardSegue, sender: Any?),在Swift 3和Xcode 8.3中将无法调用此方法。 - oOEric

28

我建议不要依赖于segue.identifier,而是直接测试destination类型:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)

    if let vc = segue.destination as? YourViewController {
        vc.someVariable = true
    }
}

这样可以避免因为拼写错误而导致的segue名称错误。


3
这应该是被接受的答案。如果你有多个UIContainerView并尝试使用.identifier方法,你会失败的 :D 感谢@andrey。 - Tom
@Tom 我觉得你没有理解问题,被接受的答案是正确的,但是这个答案可以用 Andrey 的方法更好地解决。我使用了这两个答案来解决我的问题:D 谢谢。 :) - Muhammad Danish Qureshi
啊,这个太老了。我现在避免使用Storyboard和XIB。 - Tom
@Tom 我也是。通过代码创建用户界面很棒。 - Andrey Gordeev

2

Swift 4, Xcode 9.4.1

var contentViewController : UIContentViewController?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == containerSegueName {
       contentViewController = segue.destination as? UIContentViewController
    }
}

1

macOS上的Swift 3:

// MARK: - Container View Controller

var containerViewController: ContainerViewController?

let containerSegueIdentifier = "Container Segue"

override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    if segue.identifier == containerSegueIdentifier {
        if let connectContainerViewController = segue.destinationController as? FormationViewController {
            formationViewController = connectContainerViewController
        }
    }
}

检查标识符和控制器类。


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