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中运行该计时器。我不知道它是否会在你的情况下工作,但仍然可以共享,如果它可以帮助你。