Swiftはまだ初心者です。
現在、Speechフレームワークを用いて音声認識したキーワードを別の画面に遷移した先で使っていろいろやる機能を作っています。
しかし、単語を認識して画面遷移すると、元画面が消えて「whose view is not in window hierarchy!」という文言が表示されました。原因には見当がついていません。
遷移元の画面の認識器起動→認識後に画面遷移のコード
swift
1 2override func viewDidLoad() { 3 super.viewDidLoad() 4 speechRecognizer.delegate = self 5} 6 7var recognizerImage: UIView! 8 9private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "ja-JP"))! 10private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest? 11private var recognitionTask: SFSpeechRecognitionTask? 12private let audioEngine = AVAudioEngine() 13 14@IBOutlet weak var speechRecognizerBtn: UIButton! 15@IBAction func toNextViewController(_ sender: Any) { 16 recognizerImage = recognizerImageConfig() 17 view.addSubview(recognizerImage) 18 19 try! self.startRecording() 20 21} 22 23startRecording() throws { 24 if let recognitionTask = recognitionTask { 25 recognitionTask.cancel() 26 self.recognitionTask = nil 27 } 28 29 let audioSession = AVAudioSession.sharedInstance() 30 31 try audioSession.setCategory(AVAudioSession.Category.record) 32 try audioSession.setMode(AVAudioSession.Mode.measurement) 33 try audioSession.setActive(true, options: .notifyOthersOnDeactivation) 34 35 recognitionRequest = SFSpeechAudioBufferRecognitionRequest() 36 37 let inputNode: AVAudioInputNode = audioEngine.inputNode 38 guard let Request = recognitionRequest else { fatalError("Unable to created a SFSpeechAudioBufferRecognitionRequest") } 39 40 recognitionRequest?.shouldReportPartialResults = true 41 42 recognitionTask = speechRecognizer.recognitionTask(with: Request, resultHandler: { result, error in 43 44 if let result = result { 45 self.recognizerImage.removeFromSuperview() 46 self.audioEngine.stop() 47 self.recognitionRequest?.endAudio() 48 inputNode.removeTap(onBus: 0) 49 self.recognitionRequest = nil 50 51 let word = result.bestTranscription.formattedString 52 //グローバル変数 recognizedWord 53 recognizedWord = word 54 let nextvc = self.storyboard?.instantiateViewController(withIdentifier: "nextvc") as! NextViewController 55 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5){ 56 self.present(nextvc, animated: true, completion: nil) 57 } 58 } 59 60 if error != nil { 61 print("エラー出力") 62 print(error!) 63 self.audioEngine.stop() 64 self.recognitionRequest?.endAudio() 65 inputNode.removeTap(onBus: 0) 66 self.recognitionRequest = nil 67 self.recognitionTask = nil 68 69 self.recognizerImage.removeFromSuperview() 70 } 71 }) 72 73 let recordingFormat = inputNode.outputFormat(forBus: 0) 74 inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat, block: { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in 75 self.recognitionRequest?.append(buffer) 76 }) 77 78 audioEngine.prepare() 79 try audioEngine.start() 80 81} 82} 83
原因、解決法を知っている方がいらっしゃたら、教えて頂けると幸いです。
開発環境はSwift4
iOS12が対象
Xcode10.2.1
です。
追記
遷移後の画面ではこのように書いています。
swift
1import UIKit 2 3class NextViewController: UIViewController { 4 5 let speechWord: String? = recognizedWord 6 var speechWords: (String, String, String)? 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 self.view.window?.backgroundColor = UIColor.clear 11 self.view.backgroundColor = UIColor.rgba(red: 0, green: 0, blue: 0, alpha: 0.5) 12 print(recognizedWord!) 13 } 14} 15
遷移元の画面は、その前の画面に配置されたボタンを押すことで呼び出しています。
上に複数のボタンが並び、それが押されるたびに画面がdismissして即座に別のViewControllerが呼び出されるようになっており、少し複雑な処理になっています。
見返して考えましたが、もしかしたらここに原因?があるのかもしれないと思えてきました。
コードをくれた先輩と相談してみます。
試したこと
self.view.window?.backgroundColor = UIColor.clear
を消しても、タイトルのようなエラーはやはり出てきて、遷移元の画面は消えてしまいました。
回答2件
あなたの回答
tips
プレビュー