Ios 无法使UISwitch约束生效-swift 4

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()

我试图以编程方式创建UISwitch,但由于某些原因,我无法获得任何约束。如果不使用任何约束,将在左上角创建UISwitch

我试图通过在声明我的开关时添加约束来创建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。复制所有代码作为答案,以上不仅是懒惰的补充,对不起我的不好,现在一切都好了,谢谢!虽然我真的看不出除了懒惰之外还有什么不同。无论如何谢谢你@关闭
}
后,单击
()