Swift:以编程方式更改HeightAnchor

詹姆斯·G

我下面这个视频教程:https://www.youtube.com/watch?v=4rNtIeC_dsQ

我挣扎着爬容器以变化的高度时,我选择在UI段控制不同的选项

视频中大约17:51

我声明,像这样的变种:

var inputsContainerHeightAnchor: NSLayoutConstraint?

对于约束,我现在有:

inputContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
inputContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
inputContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -60).isActive = true
inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor?.isActive = true

对于段控件,我有:

func handleLoginRegisterChange() {

    let title = segmentedLoginRegisterControl.titleForSegment(at: segmentedLoginRegisterControl.selectedSegmentIndex)

    loginRegisterButton.setTitle(title, for: .normal)

    inputsContainerHeightAnchor?.constant = segmentedLoginRegisterControl.selectedSegmentIndex == 0 ? 100 : 150



}

段控制设置,如下所示:

lazy var segmentedLoginRegisterControl: UISegmentedControl = {
    let sc = UISegmentedControl(items: ["Login", "Register"])
    sc.tintColor = .white
    sc.selectedSegmentIndex = 1
    sc.translatesAutoresizingMaskIntoConstraints = false
    sc.addTarget(self, action: #selector(handleLoginRegisterChange), for: .valueChanged)
    return sc
}()

我正在使用Xcode版本8.1

但是,当我运行这是模拟器时,输入控制器视图为100。单击任何段时它都不会更改。

有人可以看到我错过的任何东西吗?

抢马约夫

你没有做正确的部分偏偏开始在视频文件16时50分。但是,我们可以计算出从您发布的代码的问题。这些线是腥:

inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor?.isActive = true

这些行的第一行创建的实例NSLayoutConstraint,但不会激活它,也不会将其存储在变量中。因此,约束立即被破坏。除了浪费时间和电池电量外,它没有任何作用。

这些行的第二行提到了变量inputsContainerHeightAnchor,看起来很像它应该引用在前一行中创建的约束。但前行没有指派任何该变量。如果没有其他为该变量分配值,则该变量为nil。由于使用?而不是进行!取消引用,因此如果变量包含nil,则第二条语句不执行任何操作。

您可能打算编写以下代码:

inputsContainerHeightAnchor = inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor?.isActive = true

第一行将新约束存储在变量中,第二行激活新约束。这就是视频在16:50左右开始发生的情况。您可能错过的时间大约是17:15,当他从实例变量声明中复制变量名称并将其粘贴到文本上时,他说“我们将摆脱让步” let constraint该行环绕在他的屏幕上,他的缩进不正确,并且他使用键盘快捷键进行复制和粘贴,因此很难遵循。你可能以为他刚刚删除的文字let constraint =(这就是为什么我制作视频时会尽量避免使用键盘快捷键的原因。)

但是,最好这样写这两行:

inputsContainerHeightAnchor = inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor!.isActive = true

当你确定一个变量应该不会是零,并且是零是一个编程错误,然后使用!取消对它的引用。如果变量包含nil,程序将在该行停止(如果在Xcode下运行,则在调试器中)。如果您(和视频的作者)是用这种方式编写的,那么您可能会更快地发现错误,因为在您修复错误之前,该程序永远不会越过第二行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章