2017-07-29 125 views
1

我正在創建一個flashcard應用程序。現在我正處於可以左右掃描每張圖像的地步。每個圖像都有一個與之關聯的聲音文件。點擊圖像時,與其關聯的聲音文件應播放。到目前爲止,我可以通過圖像輕掃,但是當我點擊圖像時沒有聲音播放。下面的代碼。AVAudioPlayer按下手勢識別器時不會播放聲音

import UIKit 

class SecondViewController: UIViewController , UIGestureRecognizerDelegate { 



var imageIndex: Int = 0 
@IBAction func home(_ sender: Any) { 
    performSegue(withIdentifier: "home", sender: self) 
} 

@IBOutlet weak var imgPhoto: UIImageView! 


let itemList:[Card] = [ 
    Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator.m4a"), 
    Card(image: UIImage(named: "apple")!, soundUrl: "Apple.m4a"), 
    Card(image: UIImage(named: "ball")!, soundUrl: "Ball.m4a") 
] 



override func viewDidLoad() { 
    super.viewDidLoad() 


    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:))) 
    imgPhoto.isUserInteractionEnabled = true 
    imgPhoto.addGestureRecognizer(tapGestureRecognizer) 

    imgPhoto.image = (itemList[0]).image 

    // Do any additional setup after loading the view. 
    imgPhoto.isUserInteractionEnabled = true 

    let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:))) 
    leftSwipe.cancelsTouchesInView = false 

    let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:))) 
    rightSwipe.cancelsTouchesInView = false 

    leftSwipe.direction = .left 
    rightSwipe.direction = .right 


    view.addGestureRecognizer(leftSwipe) 
    view.addGestureRecognizer(rightSwipe) 

} 

    @IBAction func imageTapped(tapGestureRecognizer: UITapGestureRecognizer) 
{ 
    print("hhh") 
    itemList[imageIndex].playSound() 
    // Your action 
} 

func Swiped(gesture: UIGestureRecognizer) { 

    if let swipeGesture = gesture as? UISwipeGestureRecognizer { 

     switch swipeGesture.direction { 

     case UISwipeGestureRecognizerDirection.right : 
      print("User swiped right") 

      // decrease index first 

      imageIndex -= 1 

      // check if index is in range 

      if imageIndex < 0 { 

       imageIndex = itemList.count - 1 

      } 

      imgPhoto.image = itemList[imageIndex].image 

     case UISwipeGestureRecognizerDirection.left: 
      print("User swiped Left") 
      // increase index first 

      imageIndex += 1 

      // check if index is in range 

      if imageIndex > itemList.count - 1 { 

       imageIndex = 0 

      } 



      imgPhoto.image = itemList[imageIndex].image 
     default: 


      break //stops the code/codes nothing. 
     } 
    } 
} 
} 

然後我有另一個有AVAudioPlayer代碼的類,並且給出了每個「Card」(下面的代碼)的定義。

import Foundation; import UIKit; import AVFoundation 

var player: AVAudioPlayer? 

class Card: NSObject 
{ 
var image: UIImage 
var soundUrl: String 


init(image: UIImage, soundUrl: String) { 
    self.image = image 
    self.soundUrl = soundUrl 
} 
func playSound() 
{ 
    guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return } 
    do 
    { 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
     try AVAudioSession.sharedInstance().setActive(true) 

     player = try AVAudioPlayer(contentsOf: url) 
     guard let player = player else { return } 
     player.prepareToPlay() 
     player.play() 
    print("play") 
    } catch let error { 
     print(error.localizedDescription) 
    } 
} 
} 

該代碼編譯沒有錯誤,但沒有播放聲音。當我點擊屏幕時程序確實打印了一行,但是我沒有從播放聲音功能中打印任何行,這意味着該部分代碼沒有被執行。我已經把var player:AVAudioPlayer?在班級之外推薦,但仍然沒有運氣。我已經添加了AVAudioPlayer框架,所以這也不是問題。

enter image description here

enter image description here

+0

我發佈你的答案,確保你給出了正確的擴展名,它不是在你的卡片構造函數中要求 –

回答

1

我認爲問題出在你的擴展,你給了錯誤的分機在

guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") 

,並在此不需要擴展

Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator"), 
    Card(image: UIImage(named: "apple")!, soundUrl: "Apple"), 
    Card(image: UIImage(named: "ball")!, soundUrl: "Ball") 

更改擴展名與您的文件擴展名爲.MP4

+0

你好,我試過但仍然沒有運氣:(我不認爲這是調用播放聲音功能 –

+0

把日誌第一行,我相信它會打印日誌 –

+0

你是對的,但它確實打印線(前後衛語句)播放功能。林不知道這個問題可能是什麼 –

1

你要刪除的文件擴展名是:

let itemList:[Card] = [ 
    Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator"), 
    Card(image: UIImage(named: "apple")!, soundUrl: "Apple"), 
    Card(image: UIImage(named: "ball")!, soundUrl: "Ball") 
] 

,因爲你在func playSound()功能

guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return } 

func playSound() { 
    guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return } 

    do { 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
     try AVAudioSession.sharedInstance().setActive(true) 

     player = try AVAudioPlayer(contentsOf: url) 
     guard let player = player else { return } 
     player.prepareToPlay() 
     player.play() 
    } catch let error { 
     print(error.localizedDescription) 
    } 
} 

添加擴展,使這是加雙擴展到您的文件名是不在你的軟件包中可用。

注意:請確保您的文件名和擴展名與您的軟件包文件名相同。 該文件需要正確導入(項目構建階段>複製包資源)。

Add folder

Folders look as

+0

我這樣做,它仍然不能播放聲音。你還有其他建議嗎? –

+0

請檢查文件是否需要正確導入(Project Build Phases> Copy Bundle Resources)。 –

+0

我添加了兩個截圖的問題給你看 –

0

我認爲問題是由於NSDefaultRunLoopMode造成,其中兩個事件同時運行。當我以毫秒爲單位更新標籤時,我遇到了這個NSDefaultRunLoopMode的問題。在打開鍵盤時,它並沒有在那個時間更新。然後爲了解決這個問題我在NSRunLoopCommonModes中運行該計時器。我不知道它是否會在你的情況下工作,但仍然可以共享,如果它可以幫助你。