質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

741閲覧

whose view is not in window hierarchy!の解決法について

Haruto513

総合スコア52

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/07/31 06:08

編集2019/08/01 06:32

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
を消しても、タイトルのようなエラーはやはり出てきて、遷移元の画面は消えてしまいました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2019/07/31 06:20

NextViewController側では何も処理していないんでしょうかね? なんとなくそっちの可能性もあるのかなと思ったのですが。
Haruto513

2019/07/31 06:32

遷移先の画面では背景色の設定と、グローバル変数に保存した音声認識した単語をコンソールに表示する処理を書いています。 import UIKit class NextViewController: UIViewController { let speechWord: String? = recognizedWord var speechWords: (String, String, String)? override func viewDidLoad() { super.viewDidLoad() self.view.window?.backgroundColor = UIColor.clear self.view.backgroundColor = UIColor.rgba(red: 0, green: 0, blue: 0, alpha: 0.5) print(recognizedWord!) } } コンソールには認識した単語が表示されます。 こちらに問題があるとしたらどのあたりがそれにあたるでしょうか。
fuzzball

2019/07/31 23:54 編集

ここじゃなくて質問に追記して下さい。 あと、インデントがおかしいところがあるので直して下さい。
fuzzball

2019/08/01 01:17 編集

この(遷移元の)ViewControllerはどうやって呼び出されているのでしょうか?
takabosoft

2019/08/01 01:31

self.view.window?.backgroundColor = UIColor.clear ↑これ消したら症状が改善されませんかね?
guest

回答2

0

自己解決

遷移先の画面の設定を見直したら解決しました。
参考にしたページはこちらです。

NextViewControllerのアトリビュートインスペクタで、Presentationの設定を「Over Current Context」にしたら遷移元の画面が表示されました。

投稿2019/08/05 08:16

Haruto513

総合スコア52

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何かボタンを押したらtoNextViewController(_:)が呼び出されて、そこからコードで遷移しようとしているのだと思いますが、Storyboard上でそのボタンのAction SegueがNextViewControllerに繋がっていないでしょうか?

コードとStoryboardの両方で遷移しようとしておかしくなっているのだと思います。

投稿2019/08/01 01:29

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問