Я нахожусь в процессе написания приложения, я использую 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)
}
}
'''