1

Ich erstelle eine Flashcard-App. Gerade jetzt bin ich an dem Punkt, wo ich nach links und rechts durch jedes Bild wischen kann. Jedem Bild ist eine Audiodatei zugeordnet. Wenn auf das Bild geklickt wird, sollte die zugehörige Audiodatei abgespielt werden. Ab jetzt kann ich durch die Bilder wischen, aber wenn ich auf das Bild tippe, wird kein Ton abgespielt. Code unten.AVAudioPlayer gibt keinen Ton wieder, wenn die TAP-Gestenerkennung gedrückt wird

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

Dann habe ich eine andere Klasse, die die AVAudioPlayer Code hat und legt die Definition jedes „Card“ (Code unten).

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

Der Code wird ohne Fehler kompiliert, aber es wird kein Ton wiedergegeben. Das Programm druckt eine Zeile, wenn ich auf den Bildschirm tippe, aber ich habe keine Zeile von der Wiedergabe-Sound-Funktion gedruckt, die bedeuten muss, dass dieser Teil des Codes nicht ausgeführt wird. Ich habe den var player gestellt: AVAudioPlayer? außerhalb der Klasse wie empfohlen, aber immer noch kein Glück. Ich habe das AVAudioPlayer-Framework bereits hinzugefügt, so dass das auch nicht das Problem ist.

enter image description here

enter image description here

+0

Ich poste Ihre Antwort stellen Sie sicher, dass Sie richtige Erweiterung gegeben haben und es ist nicht erforderlich in Ihrer Karte Konstruktor –

Antwort

1

denke ich Problem ist in Ihrer Erweiterung, die Sie bei einer falschen Erweiterung gegeben haben

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

und auch Erweiterung nicht hier

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

ändern Verlängerung mit den erforderlichen Ihre Dateiendung .mp4

+0

Hallo, ich habe versucht, aber immer noch kein Glück :(Ich glaube nicht, es ruft die Wiedergabe Sound-Funktion –

+0

legte das Protokoll an erste Zeile (vor Guard-Anweisung) Play-Funktion Ich bin sicher, es wird drucken –

+0

Sie haben Recht, es druckt die Linie.Ich bin mir nicht sicher, was das Problem sein könnte –

1

Sie haben die Dateinamenerweiterung zu entfernen, wie:

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

weil Ihre Erweiterung in func playSound() Funktion als

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

Zugabe so ist es doppelte Erweiterung zu Ihrem Dateinamen hinzufügen, die nicht ist verfügbar in Ihrem Bundle.

HINWEIS: Stellen Sie sicher, dass der Dateiname und die Erweiterung mit dem Namen der Bundledatei übereinstimmen. Die Datei muss ordnungsgemäß importiert werden (Projekt-Build-Phasen> Bundle-Ressourcen kopieren).

Add folder

Folders look as

+0

Ich habe das getan und es immer noch nicht spielen der Klang. Hast du noch andere Ideen? –

+0

Überprüfen Sie, ob die Datei ordnungsgemäß importiert wurde (Projekt-Build-Phasen> Bundle-Ressourcen kopieren). –

+0

Ich fügte zwei Screenshots zur Frage für Sie –

0

denke ich, dass Problem, bei dem beide Ereignis gleichzeitig laufen wegen NSDefaultRunLoopMode verursacht. Ich hatte ein Problem mit diesem NSDefaultRunLoopMode, als ich die Zeit in Millisekunden aktualisiert habe. Beim Öffnen der Tastatur wurde nur in dieser Zeit nicht aktualisiert. Um dieses Problem zu lösen, starte ich diesen Timer in NSRunLoopCommonModes. Ich bin mir nicht sicher ob es in deinem Fall funktionieren wird aber trotzdem teilen wenn es dir irgendwie weiterhelfen kann ..

Verwandte Themen