【问题标题】:Access container view child properties swift快速访问容器视图子属性
【发布时间】:2016-02-24 17:49:39
【问题描述】:

我想要达到的目标:

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

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

【问题讨论】:

    标签: xcode swift properties containers uicontainerview


    【解决方案1】:

    一步一步:

    1. 命名视图控制器和容器视图控制器之间的 segue。
    2. 向您的视图控制器添加一个属性,该属性将包含容器视图控制器。
    3. 在您的视图控制器中实现方法prepareForSegue(_:sender:)
    4. 在方法中检查 segue.identifier 是否等于您在步骤 1 中指定的标识符。
    5. 如果为真,则将第 2 步中的 segue.destinationViewController 保存到您的资源中。
    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() ?以及如何在视图控制器中放置的按钮的操作中添加覆盖功能?
    • containerViewController.MyButton.backgroundColor.. 在您的视图控制器(不是容器视图控制器)中
    • 是的,这对我有用,非常感谢您的详细回答!
    • 太棒了!非常感谢!
    • swift 3 & Xcode 8.3 需要使用override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 否则不会调用此方法
    【解决方案2】:

    我建议不要依赖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 名称的错误。

    【讨论】:

    • 这应该是公认的答案。如果您有多个 UIContainerView 并尝试 .identifier 方法,您将失败:D 感谢@andrey
    【解决方案3】:

    斯威夫特 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
        }
    }
    

    【讨论】:

      【解决方案4】:

      适用于 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
              }
          }
      }
      

      检查标识符和控制器类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-05
        • 2015-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        • 2015-07-17
        • 1970-01-01
        相关资源
        最近更新 更多