Как воспроизвести звук, когда нажата кнопка backBarButton (из NavigationController)? (для Свифта) - PullRequest
0 голосов
/ 16 ноября 2018

Не могу узнать, как добавить воспроизводимый звук, когда нажата кнопка «Назад» в моем NavigationController.

У меня есть несколько VC в NavigationVC. Я не настраивал NavigationVC, но я установил кнопку возврата для NavigationVC в первом VC в его стеке. Я пытаюсь добавить функцию воспроизведения звука в действие этой кнопки. Но это не звонит.

Вот мой код. Это первый ViewController для NavigationVC:

override func viewDidLoad() {
    super.viewDidLoad()

    // some another code

    // set back button for Navigation Controller
    self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "backButtonIcon")
    self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "backButtonIcon")
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItem.Style.plain, target: self, action: #selector(backButtonPressed))
    self.navigationItem.backBarButtonItem?.action = #selector(backButtonPressed)
}

// this func isn't called, but has to be
@objc func backButtonPressed() {
    print("back button pressed")
    Sounds.playSound(Sounds.tap)
}

Вот звуки. Это структура в файле AppDelegate. Я использую статические свойства и функции, поэтому я не создаю экземпляр этой структуры;

struct Sounds {
static let lose = Bundle.main.url(forResource: "lose", withExtension: "mp3")
static let win = Bundle.main.url(forResource: "win", withExtension: "mp3")
static let select = Bundle.main.url(forResource: "select", withExtension: "mp3")
static let deSelect = Bundle.main.url(forResource: "unSelect", withExtension: "mp3")
static let tap = Bundle.main.url(forResource: "tap", withExtension: "mp3")

static var soundsIsDisabled = UserDefaults.init().bool(forKey: "sounds is disabled") {
    didSet {
        UserDefaults.init().set(soundsIsDisabled, forKey: "sounds is disabled")
    }
}

static func playSound(_ sound: URL?) {
    if !Sounds.soundsIsDisabled {
        guard let url = sound else { return }

        do {
            AppDelegate.audioPlayer = try AVAudioPlayer(contentsOf: url)
            try AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default, options: .defaultToSpeaker)
            try AVAudioSession.sharedInstance().setActive(true)
            AppDelegate.audioPlayer.prepareToPlay()
        }
        catch{
            print(error)
        }

        AppDelegate.audioPlayer.play()
    }
}

}

Моя цель, как вы видите, состоит в том, чтобы добавить звук нажатия на кнопки back для всех VC в NavigationVC.

Как этого добиться?

1 Ответ

0 голосов
/ 16 ноября 2018

Я нашел решение в сообщении, отправленном в комментариях.Это сообщение

Я не до конца понял, что именно там происходит (потому что там был код Objective-C).

Итак, решение заключается в создании пользовательского left BarButtonItem вместо back BarButtonItem и добавьте эту кнопку в каждый VC в NavigationVC, вам нужна эта кнопка.

Вот код, который вы должны добавить в каждый VC:

override func viewDidLoad() {
    super.viewDidLoad()

    //some other code

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "backButtonIcon"), style: UIBarButtonItem.Style.plain, target: self, action: #selector(backButtonPressed))
}

@objc func backButtonPressed() {

    // implement your action here
}
...