カテゴリー: iOS

【Swift】whose view is not in the window hierarchyで画面遷移に失敗する

はじめに

こんにちはsuzukiです。今回は備忘としてwhose view is not in the window hierarchyというデバッグ中に表示されるエラーについて、簡単にまとめて行きたいと思います。

エラーの概要

ViewWillAppearとかViewDidLoadの描画中のタイミングで画面遷移を行おうとした際に発生するエラー、
アプリはクラッシュ等は発生しないが、画面遷移がされない。

今回出会った事象

上記のエラーは結構有名で、連続する画面遷移などを設計した際に発生するのですが、
今回出会った内容としてアプリのバックフォアのタイミングで下記のスレッドが動き発生していました。

スレッドA(A画面の処理) 
 → A画面からB画面を表示

スレッドB(共通の処理)
 → 現在の画面を新規にA画面のインスタンスを生成して置き換える

という二つのスレッドがパラレルにA→Bの順番で呼ばれ発生しスレッドBの内容が行われていませんでした。
またスレッドBの処理はwhich is already presentingというエラーも併発しており、画面の状態がかなりぐちゃぐちゃになってしまっていました。

行った対応

今回の場合は下記の理由により
・スレッドAの処理を止めることが仕様上できない
・スレッドBの処理がアプリの処理として、優先されるべき
スレッドBの処理を行う際に画面Aと画面Bが表示されている場合は閉じたあと再度スレッドBの処理を行い、画面Aを表示しました。

さいごに

今回、見慣れたエラーの内容ですが、異なるスレッドで画面の遷移がエラーが重複していたため、原因の特定にかなり時間がかかりました。こういうバグが発生する状況を改善させないためにはどのように開発していくべきなのか、シンプルな作りとはなんなのか、と改めて考え直したい出来事でした。

おすすめ書籍

suzuki

シェア
執筆者:
suzuki
タグ: Swift

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前