2017-03-17 6 views
2

誰でも助けてくれますか?私は自分の質問を検索していますが、解決策を見つけられません。私が見つけたものはすべて即時にフォーマットされていませんでした。3. UIBarButtonItemから再生と一時停止を切り替えようとしています。再生ボタンがクリックされるたびにファイルを再生し、同時にUIBarButtonItemを変更して一時停止し、その逆にします。UIBarbuttonItemで再生と一時停止を切り替える方法

ところで、私はエディタからメインコントローラにナビゲーションコントローラを埋め込んでいます。

ここに私のコードスニペットがあります。

import UIKit 
import AVFoundation 

class ViewController: UIViewController {  
    @IBOutlet weak var pausePlayBtn: UIBarButtonItem! 
    var audioPlayer = AVAudioPlayer() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     prepareMusic() 
    } 

    func prepareMusic() { 
     let path = Bundle.main.path(forResource: "SomeFileName", ofType: "TypeOfFile")! 
     do { 
      audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path)) 
     audioPlayer.prepareToPlay() 
     } catch let err as NSError { 
      print(err) 
     } 
    } 

    @IBAction func togglePausePlay(sender: UIBarButtonItem) { 
     if !audioPlayer.isPlaying { 
      audioPlayer.play() 
     } else { 
      audioPlayer.stop() 
     } 
    } 
} 

私は以下を試しました。

まず、再生ボタンと一時停止ボタンを作成し、それらを私のtogglePausePlay funcに追加することから始めました。

let playBtn = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: nil) 
let pauseBtn = UIBarButtonItem(barButtonSystemItem: .pause, target: self, action: nil) 

@IBAction func togglePausePlay(sender: UIBarButtonItem) { 
    if !audioPlayer.isPlaying { 
     audioPlayer.play() 
     pausePlayBtn = playBtn 
    } else { 
     audioPlayer.stop() 
     pausePlayBtn = pauseBtn 
    } 
} 

私が試したもう1つのことはこれでした。

@IBAction func togglePausePlay(sender: UIBarButtonItem) { 
    if !audioPlayer.isPlaying { 
     audioPlayer.play() 
     self.navigationController?.navigationBar.topItem?.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: nil) 
    } else { 
     audioPlayer.stop() 
     self.navigationController?.navigationBar.topItem?.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .pause, target: self, action: nil) 
    } 
} 

アプリの開始時にこの作品は、私が初めてのボタンをクリックしてしまうと、ボタンを働くだろうすべてが一時停止して変化するであろうと、ファイルが起動します。しかし、もう一度クリックしようとすると、何も起こりません。ボタンは一時停止したままになり、プロジェクトを停止するまでファイルは再生を続けます。

ご協力いただければ幸いです。 :)

+0

- :audioPlayer.isPlayingオーディオは、ここで演奏されていない場合は、ボタンの一時停止状態を変更する必要がありますが、まだTHIS-をやっdidn't.You意味ならば!と:self.navigationController?.navigationBar.topItem?rightBarButtonItem = UIBarButtonItem(barButtonSystemItem:.pause、target:self、action:なし) –

+0

Tushar Sharma UIBarButtonItemに切り替えます(barButtonSystemItem:.play、target:self、action:nil) when!audioPlayer.isPlaying。しかし、まだ問題は残っています。 –

+0

これを最初の行として作成し、その下にaudioPlayer.play()を追加して試してみることができますか?ブレークポイントとそれが内部に入っていることを確認しますか? –

答えて

1

私はあなたのための解決策を考え出し、私のために働いています。

私が試したコードとその動作は次のとおりです。そのボタンアイテムはそのクリックで変化しています。

enter image description here

enter image description here

+0

ありがとう、Rahul、それは完璧に働いた。それが以前にはうまくいかなかった理由を知りたかっただけです。 UIBarButtonItemにアクションがないためでしたか? –

+0

あなたがここにいると思います。また、2番目の方法は、現在のビューではなく、ナビゲーションコントローラの右のバーボタンを変更しているときに機能していませんでした。 self.navigationItem.rightBarButtonItemで現在のビューの右バーボタン項目に簡単にアクセスできます。 – Rahul

+0

さて、ありがとう、Rahul。 –

0

どちらのシナリオでも、プレーヤーが音楽の再生を開始するたびに、既存のボタンに.playボタンを割り当てようとしています。それは反対でなければなりません。プレーヤーが音楽の再生を開始するたびに、ボタンを.pauseモードに変更し、プレーヤーが音楽の再生を停止すると、ボタンは再生モードになります。

let playBtn = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: nil) 
    let pauseBtn = UIBarButtonItem(barButtonSystemItem: .pause, target: self, action: nil) 

    @IBAction func togglePausePlay(sender: UIBarButtonItem) { 
     if !audioPlayer.isPlaying { 
      audioPlayer.play() 
      pausePlayBtn = pauseBtn 
     } else { 
      audioPlayer.stop() 
      pausePlayBtn = playBtn 
      } 
    } 
あなたが原因音楽の再生が開始後、ボタンを一時停止するには、プレイからその状態を変更しないと反対をやっていた

はなく、これに起因する再生状態のまま:

は、以下の変更を行います次にユーザーがボタンを押すと、音楽を再生し、停止しません。

+0

Hey Rahul私は自分のコードに変更を加えましたが、pausePlayBtnはクリックしても変更されません。それでも音楽は再生され停止しますが、システムアイテムのスタイルは変更されません。 –

関連する問題