Как воспроизвести звук, когда нажата кнопка backBarButton (из NavigationController)? (для Свифта)
Не могу узнать, как добавить воспроизводимый звук, когда нажата кнопка "Назад" в моем 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()
}
}
}
Моя цель, как вы можете видеть, состоит в том, чтобы добавить звук нажатия на кнопки backButtons для всех VC в NavigationVC.
Как этого добиться?
1 ответ
Я нашел решение в посте, отправленном в комментариях. Этот пост
Я не до конца понял, что именно там происходит (потому что там был код Objective-C).
Таким образом, решение состоит в том, чтобы создать пользовательский левый BarButtonItem вместо заднего 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
}