无法使 UISwitch 约束起作用 - swift 4

Cant get UISwitch constraints to work - swift 4

我正在尝试以编程方式创建 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 扩展中,而不是在声明开关时。

当 运行 上面的代码是我得到的错误是:

Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

我在 setupLayouts 扩展的约束的第一行收到此错误。

任何帮助都会很棒。

你需要一个懒惰的 var 在这个块中有 self 这是一个闭包,你当前的代码是一个计算的 属性 其中 returns 每个引用都有一个开关,这会导致约束崩溃,因为添加到视图的开关与您为

设置约束的对象不是同一个对象
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 ,顺便说一句,扩展与这个问题完全无关