Вместо того, чтобы обращаться к UISwitch
через аргумент sender
, вы переходите непосредственно к тому, что, как я полагаю, является значением IBOutlet
. Вместо этого вы можете получить доступ к отправителю, как описано ниже:
@IBAction func userDidSelectVisibiltySwitch(_ sender: UISwitch) {
if sender.isOn && badCondition {
sender.setOn(false, animated: false)
} else { // In this case it is normal, it does not execute the else {}
// work to be done if the user has turned off the switch
}
}
Причина, по которой ваше исправление работает, вероятно, из-за небольшой задержки, вызванной вызовом отправки, что позволяет значению IBOutlet
обновить свое значение.
Я также пошел дальше и объединил ваше заявление if
, поскольку предоставленный вами образец не требует вложенной проверки.
ОБНОВЛЕНО НА ОСНОВЕ КОММЕНТАРИИ РМАДДИ
Это решение вызвало у меня немного запаха кода, и после дальнейшего изучения я смог воспроизвести сценарии, описанные OP. Это было достигнуто установкой действия в раскадровке, как показано здесь:
С этой настройкой я увидел следующее:
- Исходный код, отправленный OP, потерпит неудачу
- Добавление DispatchQueue, как продемонстрировано OP, исправит коммутатор после небольшой задержки
- Мое опубликованное решение будет работать правильно
Предполагая, что это то, что сделал OP, первое исправление будет состоять в том, чтобы изменить событие на Value Changed
. Тогда, как указано в комментарии rmaddy, это будет выполнено независимо от того, используете ли вы аргумент или IBOutlet
. Исходя из первоначального вопроса, моя интерпретация заключалась в том, что возникла проблема с выходным значением и состоянием синхронизации в интерфейсе.