Jam*_*esG 3 nslayoutconstraint swift
我正在关注此视频教程:https : //www.youtube.com/watch?v=4rNtIeC_dsQ
当我在UI段控件中选择其他选项时,我正在努力使容器视图的高度发生变化
视频中大约17:51
我这样声明了var:
var inputsContainerHeightAnchor: NSLayoutConstraint?
Run Code Online (Sandbox Code Playgroud)
对于约束,我现在有:
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
Run Code Online (Sandbox Code Playgroud)
对于段控件,我有:
func handleLoginRegisterChange() {
let title = segmentedLoginRegisterControl.titleForSegment(at: segmentedLoginRegisterControl.selectedSegmentIndex)
loginRegisterButton.setTitle(title, for: .normal)
inputsContainerHeightAnchor?.constant = segmentedLoginRegisterControl.selectedSegmentIndex == 0 ? 100 : 150
}
Run Code Online (Sandbox Code Playgroud)
段控件的设置如下:
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
}()
Run Code Online (Sandbox Code Playgroud)
我正在使用Xcode版本8.1
但是,当我运行这是模拟器时,输入控制器视图为100。单击任何段时,它都不会更改。
有人可以看到我错过的任何东西吗?
您未能正确执行的部分从视频中的16:50开始。但是我们可以从您发布的代码中找出问题所在。这些行是可疑的:
inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor?.isActive = true
Run Code Online (Sandbox Code Playgroud)
这些行的第一行创建的实例NSLayoutConstraint,但不会激活它,也不会将其存储在变量中。因此,约束立即被破坏。除了浪费时间和电池电量外,它没有任何作用。
这些行的第二行提到了变量inputsContainerHeightAnchor,看起来很像它应该引用在前一行中创建的约束。但是上一行没有为该变量分配任何内容。如果没有其他为该变量分配值,则该变量为nil。由于使用?而不是进行!了取消引用,因此如果变量包含nil,则第二条语句不执行任何操作。
您可能打算编写以下代码:
inputsContainerHeightAnchor = inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor?.isActive = true
Run Code Online (Sandbox Code Playgroud)
第一行将新约束存储在变量中,第二行激活新约束。这就是视频在16:50左右开始发生的情况。您可能错过的时间大约是17:15,他说“我们将摆脱让步”,同时他从实例变量声明中复制变量名并将其粘贴到文本上let constraint。该行环绕在他的屏幕上,他的缩进不正确,并且他使用键盘快捷键进行复制和粘贴,因此很难遵循。您可能以为他只是删除了文本let constraint =。(这就是为什么我制作视频时会尽量避免使用键盘快捷键的原因。)
但是,最好这样写这两行:
inputsContainerHeightAnchor = inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor!.isActive = true
Run Code Online (Sandbox Code Playgroud)
当你确定一个变量应该不会是零,并且是零是一个编程错误,然后使用!取消对它的引用。如果变量包含nil,程序将在该行停止(如果在Xcode下运行,则在调试器中)。如果您(和视频的作者)是用这种方式编写的,那么您可能会更快地发现错误,因为在您修复错误之前,该程序永远都不会越过第二行。
| 归档时间: |
|
| 查看次数: |
2578 次 |
| 最近记录: |