Не могу получить ограничения UISwitch для работы - Swift 4 - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь создать 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.

Любая помощь будет отличной.

1 Ответ

1 голос
/ 21 июня 2019

Вам нужен ленивый 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
}()

Затем вызовите setupLayouts внутри viewDidLoad, кстати, расширение совершенно не имеет отношения к этой проблеме

...