【问题标题】:Modifying constraints in child controller修改子控制器中的约束
【发布时间】:2018-01-21 22:46:13
【问题描述】:

我有一个TabBarController 连接到一个视图控制器,该控制器属于class MainViewController: UIViewController

MainViewController 具有以下约束作为属性:

@IBOutlet weak var ContainerBottomConstraint: NSLayoutConstraint!

以及修改约束的方法如下:

func resizeContainer() {
    ContainerBottomConstraint.constant = Constants.playingNowBarHeight
}

我想从TabBarController 调用resizeContainer() 现在我正尝试像这样从viewDidLoad() 调用它

if let vc = viewControllers?[0] as? MainViewController {
        vc.resizeContainer()
}

但是我得到了 Fatal error: Unexpectedly found nil while unwrapping an Optional value 上线ContainerBottomConstraint.constant = Constants.playingNowBarHeight

【问题讨论】:

    标签: ios swift xcode uiviewcontroller constraints


    【解决方案1】:
    @IBOutlet lazy var containerBottomConstraint = containerView.bottomAnchor.constraint(equalTo: someView.topAnchor)
    

    如果您将约束声明为视图控制器的实例属性,则需要将其设为 var lazy 并且您必须对其进行初始化。惰性变量只有在使用时才会被读取。

    然后在视图控制器中,激活它:

    containerBottomConstraint.isActive = true
    

    现在这个约束是一个实例属性。

    【讨论】:

    • 我收到以下错误:Lazy properties must have an initializer
    【解决方案2】:

    通过向MainViewController 添加一个属性并在TabBarController 中更新它,然后根据MainViewControllerviewDidLoad 中的属性值更新约束来解决。

    MainViewController

    var shouldResize: Bool = false
    
    private func initView(){
       if shouldResize {
            ContainerBottomConstraint.constant = Constants.playingNowBarHeight
        } else {
            ContainerBottomConstraint.constant = 0
        }
    }
    

    TabBarController

    if let vc = viewControllers?[0] as? MainViewController {
        vc.shouldResize = true
    }
    

    【讨论】: