在我的应用中,我想在主视图控制器中存储多个容器视图。从那里我希望能够从主视图控制器和容器视图中修改容器视图的约束。

我做了一个简单的Xcode项目,并做了一个GIF示例,展示了我想做的事。



“重置”按钮存储在我的主视图控制器中的容器视图中。容器视图使用约束垂直和水平居中。 “向上”,“向右”,“向下”和“向左”按钮可修改容器视图的现有约束。我希望能够使用容器视图内的“重置”按钮来修改容器视图的约束。

每当我尝试从容器视图内部访问/修改存储在主视图控制器中的约束IBOutlet时,它都会崩溃,并显示“致命错误:意外发现nil”。

实现此功能的最佳方法是什么?我很听你的建议。

提前致谢。

ViewController.swift(主视图控制器)

class ViewController: UIViewController {
    @IBOutlet weak var ContainerViewVerticalConstraint: NSLayoutConstraint!
    @IBOutlet weak var ContainerViewHorizontalConstraint: NSLayoutConstraint!

    @IBAction func upButtonPressed(_ sender: Any) {
        ContainerViewVerticalConstraint.constant = -100
    }

    @IBAction func rightButtonPressed(_ sender: Any) {
        ContainerViewHorizontalConstraint.constant = 50
    }

    @IBAction func downButtonPressed(_ sender: Any) {
        ContainerViewVerticalConstraint.constant = 100
    }

    @IBAction func leftButtonPressed(_ sender: Any) {
        ContainerViewHorizontalConstraint.constant = -50
    }
}

ContainerViewController.swift(容器视图)
class ContainerViewController: UIViewController {
    @IBAction func resetButtonPressed(_ sender: Any) {
        // Modify the constraints of the container view when this button is pressed
    }
}

最佳答案

容器视图嵌入有嵌入的序列。您可以执行以下操作:

  • 在“文档大纲”中找到嵌入的segue,并为其指定标识符,例如"embedResetView"
  • prepareForSegue中,如果segue.identifier"embedResetView",则将两个约束传递到目标(“重置”)视图中的属性。约束是对象,因此它们通过引用传递。
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "embedResetView" {
            if let dvc = segue.destination as? ContainerViewController {
                dvc.horizontalConstraint = ContainerViewHorizontalConstraint
                dvc.verticalConstraint = ContainerViewVerticalConstraint
            }
        }
    }
    
  • 当按下reset按钮时,在那些约束条件中修改constant属性。
    class ContainerViewController: UIViewController {
        weak var horizontalConstraint: NSLayoutConstraint?
        weak var verticalConstraint: NSLayoutConstraint?
    
        @IBAction func resetButtonPressed(_ sender: Any) {
            horizontalConstraint?.constant = 0
            verticalConstraint?.constant = 0
        }
    }
    
  • 07-24 19:03
    查看更多