iOS

【Swift】Xcode12対応ではまったNavigationControllerの挙動変更

投稿日:

はじめに

こんにちはsuzukiです。皆さんXcode12対応はおすみでしょうか、今回も駆け込みで色々対応しております。その際にはまった内容として、NavigationControllerの問題について、少し掘り下げてみます。
内容がわかれば、納得はいくのですが、気づかず実装しておりかなり焦りました。

・Xcode12.2
・appDelegate

今回のバグ

今回のバグが起きるパターンとしては下記の要素が関係します。
・NavigationControllerのsetViewControllers
・Xcode12.2でビルドしている(もしかしたら他のバージョンでも起きるかも)

バグの発生パターンの絞り込みをするためテストアプリを作成したのですが、いまいち納得行っていません。
NavigationViewControllerのSetViewControllerで遷移した際に、viewControllersに元画面が残っているという事象が起きます。
上記状態で次の画面を表示して、戻ってくるとなくなっているため、安易に解決もできませんでした。

詳細な内容

下記のような遷移をした場合に、Xcode11.3とXcode12.2でNavigationController.viewcontrollersの中身に差が出ます。

①ViewController
↓SetViewControllersで遷移
②NEXTViewController
↓pushで遷移
③ENDViewController
↓NavigationViewControllerの戻るでもどる
④NEXTViewController

NavigationController.viewcontrollersを確認すると

viewDidLoadとviewWillAppear
Xcode11.3でビルド
②[NEXTViewController]
④[NEXTViewController]

Xcode12.2でビルド
②[Viewcontroller,NEXTViewController]
④[NEXTViewController]

viewDidAppear
全部想定どおり
②[NEXTViewController]
④[NEXTViewController]

修正

今回の内容はNavigationControllerのviewControllersを信用しないということで、
UIViewControllerの拡張を行いsetViewControllerのフラグを持たせることにしました。
setViewControllersはコードからしか指定していないので、下記の対応を入れました。

①setViewControllersを検索
上記のフラグをtrue
②.viewcontrollersを検索
.firstや[0]などの指定があれば
flagがtrueだったら+1
viewDidAppearでフラグをおる(戻ってきたときのため)

ぱっと見きちんと動いていそうですが、正直不安です。

さいごに

今回一部の場合しかsetViewControllersで遷移をしていなかったため、事象の検知がかなり遅れました。
HistoryStackをうまく使うという方針で諸々コードの見直しとか必要なのかなと思っております。

おすすめ書籍

[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 WEB+DB PRESS plus 詳解 Swift 第4版 [改訂新版]Swiftポケットリファレンス (POCKET REFERENCE)

blog-page_footer_336




blog-page_footer_336




-iOS
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

iOS13ダークモード対応

1 はじめに2 一時しのぎ3 実装3.1 UI Element Colors3.2 Color Set3.3 コードで描きたい3.4 カスタムのカラーを定義する3.5 画像をモードで動的に変更したい4 ...

[Swift]AlertControllerでメモリリークが起きた!便利なMemory Graph

1 はじめに2 今回の問題2.1 deinitの調査2.2 原因の調査3 解決策4 Memory Graphについて5 さいごに6 おすすめ書籍 はじめに こんにちは、suzukiです。この記事の結論 ...

Swift5.5での非同期処理async/awaitの追加

1 はじめに2 async/await2.1 実装2.2 シーケンス実行2.3 パラレル実行2.4 メインスレッド問題3 さいごに4 おすすめ書籍 はじめに Xcode13がリリースされ、Swift5 ...

[SwiftUI]SwiftUIで動的にViewの更新をする方法

1 はじめに2 SwfitUIのViewについて3 値の更新について3.1 Stateの特徴3.2 ObservedObjectの特徴3.3 EnvironmentObjectの特徴4 さいごに5 お ...

no image

iOSでFirebase Authenticationを実装してみる その2

1 はじめに2 匿名アカウントから永久アカウントに変換3 サインアウト4 アカウントの削除5 パスワードの再設定メール配信6 さいごに7 おすすめ書籍 はじめに こんにちは、Yossyです。 前回は、 ...

フォロー

blog-page_side_responsive

2021年3月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。