【问题标题】:Cant get UISwitch constraints to work - swift 4无法让 UISwitch 约束工作 - swift 4
【发布时间】:2019-06-20 21:10:21
【问题描述】:

我正在尝试以编程方式创建 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_BAD_ACCESS(代码=EXC_I386_GPFLT)

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

任何帮助都会很棒。

【问题讨论】:

  • 在您的switchOnOff 属性代码中添加一个打印语句,看看会发生什么。

标签: ios swift nslayoutconstraint uiswitch programmatically


【解决方案1】:

您需要一个惰性 var 在此块中包含 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 ,顺便说一句,扩展与这个问题完全无关

【讨论】:

  • 当我尝试使变量变得惰性时,我收到此错误 'lazy' must not be used on a computed property 这将它带回它只是 var。跨度>
  • 按原样复制答案中的所有代码,上面不仅添加了lazy
  • 对不起,现在一切正常,谢谢!尽管除了添加 lazy 之外,我实际上看不到区别。还是谢谢你!
  • @spoax () 结束后的}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多