酢ろぐ!スマートフォン用の表示で見る酢ろぐ!カレーが嫌いなスマートフォンアプリプログラマのブログ。開発-iOS数年前から開発しているアプリで謎の不具合が発生していました。「ときどきボタンを押してもフリーズしたようになって画面遷移しない」というものでした。再現性がものすごく低くてほとんど発生しないことからスルーされてきました。先日、ほぼ100%再現させる方法が判明したので原因を追求することになりました。8.3.1iOSアプリ不具合の発生を確認しているiOSバージョン10.39.3.5不具合の再現手順について不具合の再現手順は以下の通りでした。(←おかしい)UINavigationControllerを実装していると左エッジから右へスワイプする*1と画面が戻るじゃないですか。その動作を同じ画面で何度も繰り返すと画面遷移がおかしくなってしまうというものでした。現象について開発中のアプリはよくある画面遷移するアプリです。遷移するような構成です。画面遷移は以下のコードのように書いています。true)該当のアプリは戻るボタン(leftBarButtonItem)をカスタマイズしていました。ここが問題だと判明するまでとても時間がかかってしまいました。報告が上がって来た時点では「突然ボタンをタップしても反応がなくなってしまう」という指摘でしたからね......ボタンが反応しなくなっている理由についてログを貼ってライフサイクル等がどのようになっているかを追跡した結果、UINavigationController#pushViewControllerでは問題なく画面遷移がおこなわれていました。遷移先に表示されているのがDetailViewControllerではなくて、謎の透明viewだったために操作を受け付けなくなってしまい反応がなくなる=フリーズしていると判断されてしまったようです。通常、画面遷移した場合には以下の順番でdelegateが実行されます。DetailViewController#viewDidLoadDetailViewController#viewWillAppearDetailViewController#viewDidAppear異常時には、3番目のDetailViewController#viewDidAppearが実行されていませんでした。戻るボタンをカスタマイズしていると画面遷移しなくなるログをペタペタ貼った結果なぜ操作ができなくなるのかはわかりましたが、その原因がわかりませんでした。次に少しずつコメントアウトしていって問題の場所を特定していきました。このアプリでは戻るボタンをカスタマイズしていることは前記の通りです。具体的にはDetailViewController#viewWillAppearで以下のように書いていました。}}この戻るボタンのカスタマイズ処理をコメントアウトすることで、不具合が発生しなくなるのが確認できました。厳密に書いておくと下記の部分をコメントアウトするだけで問題は発生しなくなりました。UIGestureRecognizerDelegate戻るボタンをカスタマイズしたことがある方ならご理解いただけると思うのですが、戻るボタンのカスタマイズでは色々と対応が必要になります。(←今回の問題の要点)戻るボタンの画像を変更したいだけであれば、navigationItem.leftBarButtonItemに適当なUIBarButtonItemを突っ込むだけで達成することができます。この方法だけだと「左エッジスワイプ」が無効になってしまいます。該当の画面から抜けているにも関わらずにDetailViewControllerをinteractivePopGestureRecognizerのdelegateに指定したままにしているのがマズイので修正するパターンと、そもそも画面ごとに戻るボタンをカスタマイズしない方法です。修正案1viewWillAppearでinteractivePopGestureRecognizerに設定されていたdelegateを保持しておき、viewWillDisappearで元のdelegateに変えることでこの不具合は発生しなくなりました。originalRecognizerDelegate}修正案2AppDelegateとかで戻るボタンの矢印を指定する。方向性を定めず、その時興味のあるネタを書いています。嫌いな食べ物はカレーです。FirebaseでG...注目記事はてなブログをはじめよう!ch3cooh393さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。