私は、あなたがリンクした質問の中で通知を購読し、次にprogrammaticVolumeChangeという名前の変数を追加するとします。変数をプログラムで設定して変数をtrueに設定すると、関数observeValueForKeyPathに変数がtrueの場合、アラームはキャンセルされません(自然にfalseに設定されます)。ユーザーが音量ボタンを押すと、そのコードはあなたのコードではないことがわかります。おそらくプログラムのボリューム変更と関数呼び出しの間の時間をテストするかもしれませんが、うまくいくと思います。
例:
var programmaticVolumeChange = false
func changeVolumeProgramatically() {
programmaticVolumeChange = true
//change volume programmatically after
}
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject,
change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if keyPath == "outputVolume"{
if programmaticVolumeChange {
programmaticVolumeChange = false
} else {
//handle logic for user volume button press
}
}
}
なぜあなたはボタンが、具体的押されたときに知っておく必要がありますか? –
これはアラームアプリケーションなので、アラームが発生すると、私のアプリはシステムボリュームを現在のレベルから最大レベルに変更します。このボリュームの変更はプログラム的なものであり、ユーザがボリュームボタンを押さなくても、以下のトリガが発生します:AVAudioSession.sharedInstance()。addObserver(self、forKeyPath: "outputVolume"、options:NSKeyValueObservingOptions.New、context:nil) – Pavel
Makesアラームが消えた後にオブザーバーを取り外すほうが簡単でしょうか?それはあなたのコードで実行可能ではありませんか? –