2016-08-18 5 views
-1

Я создаю игру с изображением бинго. У меня есть просмотр коллекции с отображением девяти из двенадцати изображений. Я создал цикл for for, чтобы произнести девять высказываний, каждое высказывание, соответствующее одному изображению, отображаемому в представлении коллекции. Проблема в том, что все девять высказываний говорят один за другим без паузы. Высказывания «выплевываются» один за другим на консоли сразу после того, как я нажимаю кнопку воспроизведения в предыдущей раскадровке. Мне нужно одно высказывание, которое нужно произнести, и цикл для паузы, пока игрок не ударит соответствующее изображение. Затем мне нужно, чтобы цикл возобновился и произнес следующее высказывание, пока игрок не получит бинго. Выполнение didFinishSpeechUtterance не вызывается. Нет ничего в консоли при тестировании в симуляторе. Я упомянул «Как я могу сделать речь сразу для каждой итерации цикла while в Swift?» И «Проблема с AVSpeechSynthesizer, любые обходные пути?» Я также упомянул «метод делегирования AVSpeechSynthesizer didStartSpeechUtterance, который не называется», но я все еще тупик.AVSpeechSynthesizer didFinishSpeechUtterance не называется

class FarmViewController: UIViewController, UICollectionViewDataSource,   
    UICollectionViewDelegate, AVSpeechSynthesizerDelegate { 


var arrayOfImages = ["pig", "horse", "dog", "cow", "duck", "cat", "sheep", "chicken", "rooster", "goat", "mouse", "donkey"] 

var arrayOfSpeechUtterances = ["pig", "horse", "dog", "cow", "duck", "cat", "sheep", "chicken", "rooster", "goat", "mouse", "donkey"] 

var arrayOfSU = [String]() 

var speechSynthesizer = AVSpeechSynthesizer() 

var images = ["pig", "horse", "dog", "cow", "duck", "cat", "sheep", "chicken", "rooster", "goat", "mouse", "donkey"] 

var speechUtterances = [AVSpeechUtterance(string: "pig"), AVSpeechUtterance(string: "horse"), AVSpeechUtterance(string: "dog"), AVSpeechUtterance(string: "cow"), AVSpeechUtterance(string: "duck"), AVSpeechUtterance(string: "cat"), AVSpeechUtterance(string: "sheep"), AVSpeechUtterance(string: "chicken"), AVSpeechUtterance(string: "rooster"), AVSpeechUtterance(string: "goat"), AVSpeechUtterance(string: "mouse"), AVSpeechUtterance(string: "donkey")] 

var dict = [AVSpeechUtterance(string: "pig"): "pig", AVSpeechUtterance(string: "horse"): "horse", AVSpeechUtterance (string: "dog"): "dog", AVSpeechUtterance(string: "cow"): "cow", AVSpeechUtterance(string: "duck"): "duck", AVSpeechUtterance(string: "cat"): "cat", AVSpeechUtterance(string: "sheep"): "sheep", AVSpeechUtterance(string:  "chicken"): "chicken", AVSpeechUtterance(string: "rooster"): "rooster", AVSpeechUtterance(string: "goat"): "goat", AVSpeechUtterance(string: "mouse"): "mouse", AVSpeechUtterance(string: "donkey"): "donkey"] 

var currentName = "" 

var queue = dispatch_queue_create("com.speechUtterances.serialqueue", DISPATCH_QUEUE_SERIAL) 

переопределение функ viewDidLoad() { super.viewDidLoad()

collectionView.delegate = self 
collectionView.dataSource = self 
speechSynthesizer.delegate = self 
self.speechSynthesizer.delegate = self 

arrayOfImages.shuffle() 

for image in arrayOfImages [0...8] { 
    arrayOfSU.append(image) 
} 

arrayOfSU.shuffle() 

**dispatch_sync(queue) {() -> Void in 
for name in self.arrayOfSU { 
let speechUtterances = AVSpeechUtterance (string: name) 

    var beforeSpeechString = "" 
    var beforeSpeech = AVSpeechUtterance (string: beforeSpeechString) 
    self.speechSynthesizer.speakUtterance(beforeSpeech) 
    print("before speech")** 

    var currentName = AVSpeechUtterance (string: name) 
    **print("current name") 

    speechUtterance.rate = 0.50 
    speechUtterance.pitchMultiplier = 2.0 
    speechUtterance.volume = 1.0** 

    **self.speechSynthesizer.speakUtterance(currentName) 
    } 
func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didFinishSpeechUtterance utterance: AVSpeechUtterance!){ 
    print("finish") 
    }** 
} 
} 

ответ

0

Этот вопрос вы написали метод делегата внутри метода viewDidLoad. Вы должны написать его снаружи, и это сработает. Как показано ниже:

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    collectionView.delegate = self 
    collectionView.dataSource = self 
    speechSynthesizer.delegate = self 

    arrayOfImages.shuffle() 

    for image in arrayOfImages [0...8] 
    { 
     arrayOfSU.append(image) 
    } 

    arrayOfSU.shuffle() 

    dispatch_sync(queue) {() -> Void in 
     for name in self.arrayOfSU 
     { 
      let speechUtterances = AVSpeechUtterance (string: name) 
      var beforeSpeechString = "" 
      var beforeSpeech  = AVSpeechUtterance (string: beforeSpeechString) 
      self.speechSynthesizer.speakUtterance(beforeSpeech) 
      print("before speech") 

      var currentName = AVSpeechUtterance (string: name) 
      print("current name") 

      speechUtterance.rate   = 0.50 
      speechUtterance.pitchMultiplier = 2.0 
      speechUtterance.volume   = 1.0 

      self.speechSynthesizer.speakUtterance(currentName) 
     } 
    } 
} 

func speechSynthesizer(synthesizer: AVSpeechSynthesizer!,didFinishSpeechUtterance utterance: AVSpeechUtterance!) 
{ 
    print("finish") 
} 
+0

Это работало Midhun MP! Тем не менее, высказывания все еще говорят без паузы в цикле, и метод didFinishSpeechUtterance вызывается после того, как все девять высказываний были произнесены вместо паузы после каждого отдельного высказывания. – Alicia

 Смежные вопросы

  • Нет связанных вопросов^_^