UIButton не переключается между двумя изображениями Swift 4.2

Я хочу добавить звуки в свое приложение. Я добавил UIButton с двумя изображениями: soundON и soundOFF. Когда я вызываю настройки звука в приложении в первый раз, они нормально переключаются с каждым изображением. Однако, когда я возвращаюсь к настройкам звука во второй и последующие разы, это похоже на то, что изображения soundOff не исчезают при отображении изображения soundOn. Странно, потому что код такой короткий и простой.

func soundButton() {
    sounds = UIButton(frame : CGRect(x: 65, y: 70, width: 40, height:40))
    sounds.setImage(UIImage(named : "soundON"), for : .normal)
    sounds.setImage(UIImage(named : "soundOFF"), for : .selected)
    sounds.showsTouchWhenHighlighted = true
    sounds.addTarget(self, action: #selector(soundButtonTapped), for: .touchUpInside)
    self.soundView.addSubview(sounds)
}

@objc func soundButtonTapped(_ sender: Any) {
    sounds.isSelected.toggle()
    isSoundOn.toggle()
}

Я добавил видео, чтобы показать проблему, так как это сэкономит тонну ввода.

http://www.reeflifeapps.com/soundError.mov

Любая помощь приветствуется.

Обновить: У меня была кнопка на UIView, которая была скрыта при запуске головоломки. Когда пользователь нажимал значок «Настройки звука», UIView настроек звука отображался. У меня была кнопка на этой функции, чтобы отобразить настройки звука. Я переместил его в viewDidLoad(), и он исправил это.

где ты это назвал soundButton()

Anbu.Karthik 21.03.2019 05:40

Похоже, что soundButton() вызывается каждый раз, когда вы открываете настройки звука, поэтому, когда вы открываете настройки звука в первый раз, он работает нормально, но когда вы снова открываете его, он добавит новую звуковую кнопку в soundView.

Yuvrajsinh 21.03.2019 06:59

Кажется, что ваша звуковая кнопка создается каждый раз, когда вы показываете системный звук.

AjinkyaSharma 21.03.2019 08:35

покажите нам оба метода переключения, а также где вы вызываете soundButton() ?? Вопрос @ anbu хорош.

Abu Ul Hassan 21.03.2019 14:25

@ Анбу, вот и все. У меня была кнопка на UIView, которая была скрыта при запуске головоломки. Когда пользователь нажимал значок «Настройки звука», UIView настроек звука отображался. У меня была кнопка на этой функции, чтобы отобразить настройки звука. Я переместил его в viewDidLoad(), и он исправил это. Пожалуйста, укажите это как ответ, и я приму его.

David Sanford 21.03.2019 14:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
120
1

Ответы 1

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

var isSoundOn = false

@objc func soundButtonTapped(_ sender: Any) {
    isSoundOn.toggle()
    if isSoundOn {
        // your logic when sound on (set button selected image, action etc)
    } else {
        // logic when sound off (set button not selected image, action etc)
    }
}

Если вы все еще хотите использовать soundButton.isSelected в качестве логической переменной, определите нет изображения для разных состояний в soundButton.setImage(yourImage, for: .selected) и soundButton.setImage(yourImage, for: .normal) и определите их следующим образом:

soundButton.setImage(soundButton.isSelected ? soundOnImage : soundOffImage, for: .normal)

Можно использовать один из этих двух подходов, описанных выше.

Обновлено:

Как заявил Ллойд Кайзер, isSoundOn = !isSoundOn обновлено как isSoundOn.toggle()

В swift 4.2 isSoundOn = !isSoundOn можно заменить на isSoundOn.toggle()

Lloyd Keijzer 21.03.2019 08:26

Предустановка изображений (один раз) для .selected и .normal и изменение их с помощью isSelected — довольно стандартная практика.

vadian 21.03.2019 14:31

Спасибо всем. Я пробовал оба вышеперечисленных с тем же результатом. Кнопка загружается в viewDidLoad(). Изображения по-прежнему переключаются, но накладываются друг на друга, а не заменяют друг друга. Вот что так странно. Swift 4.2, может быть, мне нужно удалить изображение перед отображением второго?

David Sanford 21.03.2019 14:47

Я знаю, что это хорошо известная практика, однако я предложил заменить текущее изображение кнопки, поскольку @DavidSanford говорит, что оно накладывает изображение, а не заменяет его. Вероятно, у вас есть другая проблема, связанная с кодом, который вы не отобразили здесь, потому что я пробовал и не вижу такой же проблемы с кодом выше.

Yusuf Kamil AK 22.03.2019 18:12

Другие вопросы по теме