Ios 无法使UISwitch约束生效-swift 4
我试图以编程方式创建UISwitch,但由于某些原因,我无法获得任何约束。如果不使用任何约束,将在左上角创建UISwitch 我试图通过在声明我的开关时添加约束来创建UISwitch,这确实会将开关移动到其他位置。但是,这是一个问题,因为我希望将其约束在视图中的其他项上Ios 无法使UISwitch约束生效-swift 4,ios,swift,nslayoutconstraint,uiswitch,programmatically,Ios,Swift,Nslayoutconstraint,Uiswitch,Programmatically,我试图以编程方式创建UISwitch,但由于某些原因,我无法获得任何约束。如果不使用任何约束,将在左上角创建UISwitch 我试图通过在声明我的开关时添加约束来创建UISwitch,这确实会将开关移动到其他位置。但是,这是一个问题,因为我希望将其约束在视图中的其他项上 class cameraController: UIViewController { var switchOnOff: UISwitch { let switchOnOff = UISwitch()
class cameraController: UIViewController {
var switchOnOff: UISwitch {
let switchOnOff = UISwitch()
switchOnOff.isOn = false
switchOnOff.translatesAutoresizingMaskIntoConstraints = false
switchOnOff.addTarget(self, action: #selector(switchButton(_:)), for: .valueChanged)
return switchOnOff
}
}
extension cameraController{
@objc func switchButton(_ sender:UISwitch){
if (sender.isOn == true){
print("UISwitch state is now ON")
}
else{
print("UISwitch state is now Off")
}
}
}
extension cameraController {
private func setupLayouts() {
view.addSubview(switchOnOff)
switchOnOff.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20).isActive = true
switchOnOff.topAnchor.constraint(equalTo: photosButtonIcon.bottomAnchor, constant: 20).isActive = true
}
}
我希望能够将开关的约束添加到setupLayouts扩展中,而不是在声明开关时
运行上述代码时出现的错误是:
线程1:EXC\U坏访问(代码=EXC\U I386\U GPFLT)
我在setupLayouts扩展中的第一行约束中遇到此错误
任何帮助都会很好。您需要一个惰性变量,以便在该块中具有
self
,该块是一个闭包,您当前的代码是一个计算属性,它为每个引用返回一个开关,并导致约束崩溃,因为添加到视图中的开关与您为其设置约束的对象不同
lazy var switchOnOff: UISwitch = {
let switchOnOff = UISwitch()
switchOnOff.isOn = false
switchOnOff.translatesAutoresizingMaskIntoConstraints = false
switchOnOff.addTarget(self, action: #selector(switchButton(_:)), for: .valueChanged)
return switchOnOff
}()
然后在
viewDidLoad
内调用setupLayouts
,顺便说一句,扩展与此问题完全无关在switchOnOff
属性代码中放入一条print语句,看看会发生什么。当我尝试使变量变为lazy时,我得到这个错误“lazy”不能用于计算属性,因为它会将其恢复为var。复制所有代码作为答案,以上不仅是懒惰的补充,对不起我的不好,现在一切都好了,谢谢!虽然我真的看不出除了懒惰之外还有什么不同。无论如何谢谢你@关闭}
后,单击()
。