Программно кодирует 2 UIS-переключателя в 1 сцене - PullRequest
1 голос
/ 26 февраля 2020

Я нахожусь в процессе написания приложения, я использую Xcode 11.3.1 / Swift 5 (хотя эта проблема такая же в Xcode 10 / Swift 4). Первоначально, когда я начал писать свое приложение, я использовал раскадровку, чтобы поместить два UIS-переключателя в сцену, и идея заключалась в том, что если UISwitch-1 включен, то UISwitch-2 выключен, и наоборот, когда пользователь нажимает на любой из них. Функционал работает удовольствие (ну мои методы / код / ​​IBActions и IBOutlets) - все работает.

Однако я хочу программно кодировать переключатели UIS, а не использовать раскадровку, потому что я хочу иметь возможность размещать переключатели в разных местах на оси Y в зависимости от типа устройства iPhone, ie. поскольку iPhone 11Pro Max длиннее iPhone 6, тогда я хочу сместить UIS-переключатели вниз. Я не верю, что смогу сделать это в раскадровке, поэтому хочу программировать их.

Проблема не в кодировании переключателей, я их кодировал, и они работают. Однако проблема в том, что если я включаю UISwitch-1, то я не могу понять код, чтобы выключить UISwitch-2 (и наоборот). Я думаю, что я терплю неудачу в том, что не знаю, как вызывать IBOutlet в методах для настройки переключателя 'other' (ie. Тот, который пользователь не переключал).

Блок кода ниже - это код, связанный с техникой / методом раскадровки с использованием IBActions и IBOutlets:

'' '

    // MARK: My UISwitches - toggle between the two UISwitches
    @IBAction func singleUserModeSwitch(_ sender: UISwitch) {
        if dontAllowEditing == false {
            if (sender.isOn) == true {
                setFamilyMode.setOn(false, animated: true)
            } else {
                setFamilyMode.setOn(true, animated: false)
            }
        } else {
            myAlertNoDriverProfile()
        }
    }


    @IBOutlet weak var setFamilyMode: UISwitch!


    @IBAction func familyUserModeSwitch(_ sender: UISwitch) {
        if dontAllowEditing == false {
            if (sender.isOn) == true {
                setSingleMode.setOn(false, animated: true)
            } else {
                setSingleMode.setOn(true, animated: false)
            }
        } else {
            myAlertNoDriverProfile()
        }
    }


    @IBOutlet weak var setSingleMode: UISwitch!

'''

Однако следующий блок кода - это мой код при попытке программного программирования UIS-переключатели и, как я уже сказал, код работает так, что я могу отображать UIS-переключатели, однако, когда я нажимаю на один из UIS-переключателей, которые я программно кодировал, я не могу заставить их обновить другой UIS-переключатель, который я создал программно ...

'' '

 // MARK: Display Switch Buttons
    func displaySwitches() {

        // Determine device type
        if DeviceType.isiPhone6 || DeviceType.isiPhoneX {
            singleUserModeSwitchPositionY = 484
            familyUserModeSwitchPositionY = 525
        }

        if DeviceType.isiPhone6Plus || DeviceType.isiPhoneXs {
            singleUserModeSwitchPositionY = 504
            familyUserModeSwitchPositionY = 545
        }

        // Display UISwitch-1
        let singleUserModeSwitch = UISwitch(frame:CGRect(x: 220, y:singleUserModeSwitchPositionY, width: 0, height:0))
        singleUserModeSwitch.isOn = true
        singleUserModeSwitch.thumbTintColor = UIColor.white
        singleUserModeSwitch.tintColor = Colors.jamesBlue
        singleUserModeSwitch.onTintColor = Colors.jamesBlue
        singleUserModeSwitch.setOn(false, animated: true)
        singleUserModeSwitch.addTarget(self, action: #selector(valueChange1), for:UIControl.Event.valueChanged)
        view.addSubview(singleUserModeSwitch)

        // Display UISwitch-2
        let familyUserModeSwitch = UISwitch(frame:CGRect(x: 220, y:familyUserModeSwitchPositionY, width: 0, height:0))
        familyUserModeSwitch.isOn = false
        familyUserModeSwitch.thumbTintColor = UIColor.white
        familyUserModeSwitch.tintColor = Colors.jamesBlue
        familyUserModeSwitch.onTintColor = Colors.jamesBlue
        familyUserModeSwitch.setOn(true, animated: true)
        familyUserModeSwitch.addTarget(self, action: #selector(valueChange2), for:UIControl.Event.valueChanged)
        self.view.addSubview(familyUserModeSwitch)
    }

    @objc func valueChange1(mySwitch1: UISwitch) {
        if mySwitch1.isOn{
            print("Switch1 (singleUserModeSwitch) is ON")
            // I think the lines below (where I try an call the .setOn function is where the problem is
            // as I somehow need to call an IBOULET however I don't have one defined because I am
            // programmatically creating the UISwitches
            setFamilyMode.setOn(false, animated: true)
        } else {
            print("Switch1 (singleUserMoeSwitch) is OFF")
            setFamilyMode.setOn(true, animated: true)
        }
    }

    @objc func valueChange2(mySwitch2: UISwitch) {
        if mySwitch2.isOn{
            print("Switch2 (familyUserModeSwitch) is ON")
            setSingleMode.setOn(false, animated: true)
        } else {
            print("Switch1 (singleUserMoeSwitch) is OFF")
            setSingleMode.setOn(true, animated: true)
        }
    }
'''

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

1. Создайте setSingleMode и setFamilyMode как instance properties ViewController.

2. В displaySwitches() установите их значения как singleUserModeSwitch и familyUserModeSwitch

3. Измените valueChange1(_:) и valueChange2(_:) определения соответственно.

Вот код, обобщающий вышеприведенные пункты.

class ViewController: UIViewController {
    var setSingleMode: UISwitch?
    var setFamilyMode: UISwitch?

    func displaySwitches() {
        //rest of the code...
        let singleUserModeSwitch = UISwitch(frame:CGRect(x: 220, y:singleUserModeSwitchPositionY, width: 0, height:0))
        //rest of the code...
        singleUserModeSwitch.addTarget(self, action: #selector(valueChange1(_:)), for:UIControl.Event.valueChanged)
        self.setSingleMode = singleUserModeSwitch

        let familyUserModeSwitch = UISwitch(frame:CGRect(x: 220, y:familyUserModeSwitchPositionY, width: 0, height:0))
        //rest of the code...
        familyUserModeSwitch.addTarget(self, action: #selector(valueChange2(_:)), for:UIControl.Event.valueChanged)
        self.setFamilyMode = familyUserModeSwitch
    }

    @objc func valueChange1(_ mySwitch1: UISwitch) {
        print("Switch1 (singleUserModeSwitch) is \(mySwitch1.isOn ? "ON" : "OFF")")
        setFamilyMode?.setOn(!mySwitch1.isOn, animated: true)
    }

    @objc func valueChange2(_ mySwitch2: UISwitch) {
        print("Switch2 (familyUserModeSwitch) is \(mySwitch2.isOn ? "ON" : "OFF")")
        setSingleMode?.setOn(!mySwitch2.isOn, animated: true)
    }
}
0 голосов
/ 26 февраля 2020

Сделайте переключение в коде следующим образом:

lazy var setFamilyMode: UISwitch = {
        let familySwitch = UISwitch()
        familySwitch.translatesAutoresizingMaskIntoConstraints = false
        // switch property settings
        return familySwitch
}()

lazy var setSingleMode: UISwitch = {
    let singleSwitch = UISwitch()
    singleSwitch.translatesAutoresizingMaskIntoConstraints = false
    // switch property settings
    return singleSwitch
}()

Затем добавьте переключатель в представление:

view.addSubView(setFamilyMode)
view.addSubView(setSingleMode)

Добавьте ограничения или установите рамку для переключателей, как требуется. Если вы устанавливаете фрейм, установите для свойства translatesAutoresizingMaskIntoConstraints переключателей значение true. Сохраните yAxis согласно вашему требованию и измените согласно своему коду.

Не забудьте добавить цель для ваших коммутаторов

setFamilyMode.addTarget(self, action: #selector(valueChange1(_:)), for: .valueChanged)
setSingleMode.addTarget(self, action: #selector(valueChange2(_:)), for: .valueChanged)
...