2017-03-17 50 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函數中來開始。

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 
    } 
} 

我試過的第二件事就是這個。

@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意味着,如果聲音是不是在玩在這裏你必須改變按鈕的暫停狀態,但你仍然didn't.You做這個 - :?self.navigationController .navigationBar.topItem .rightBarButtonItem =的UIBarButtonItem(barButtonSystemItem:.pause,目標:自,動作:無) –

+0

圖莎爾夏爾馬我切換到的UIBarButtonItem(barButtonSystemItem:.play,目標:自,動作:無)當!audioPlayer.isPlaying。但問題仍然存在。 –

+0

你可以作爲第一線,並添加audioPlayer.play()在其下方和try.Can你把。斷點並檢查它是在裏面? –

回答

1

我想出了一個解決方案,u和它的工作對我來說。

這是我試過的代碼和它的工作。 buttonitem正在改變其點擊。

enter image description here

enter image description here

+0

非常感謝Rahul,它非常完美。只是想知道爲什麼它以前沒有工作。是否因爲UIBarButtonItem沒有動作? –

+0

我想你就在這裏。此外,您嘗試的第二種方法不起作用,因爲您正在更改導航控制器上的右側欄按鈕而不是當前視圖。您可以通過self.navigationItem.rightBarButtonItem簡單地訪問當前視圖的右欄按鈕項目。 – Rahul

+0

好的,再次感謝拉胡爾。 –

0

在這兩種情況下,只要玩家開始播放音樂,您就試圖將.play按鈕分配給您現有的按鈕。它應該是相反的。每當玩家開始播放音樂時,您的按鈕應該變爲.pause模式,並且當播放器停止播放音樂時,該按鈕應該進入.play模式。

做以下修改:

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仍然不會改變。它仍然播放和停止音樂,但不會改變它的systemItem風格。 –