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


関連記事

swift

[Swift]ObjectMapperで簡単にJSONを読み込む

1 はじめに2 準備3 実装3.1 基本的な使い方3.2 ネスト配列に対応してみよう4 さいごに はじめに こんにちは、onukiです。 私はSwiftでJSONを取り扱う際に、 ObjectMapp ...

iOS13で発生するUICollectionviewのカクつきを解消する

iOS13でCollectionViewの動作が少し変わりました。 Cellの入れ替え時にデータの更新を行う際にはどのように作成すれば良いか、関係のあるデリゲートを含め説明させていただいております。 おまけとして、Xcode11.3対応を行った際に対応した内容を簡単にですが記述しております。Xcode11対応をされる方の参考になればと思います。

swift

[iOS]意外と簡単ウィジェット機能を実装してみる

1 はじめに2 OSごとのできること3 ウィジェットの実装3.1 Today Extensionの追加3.2 Chartを表示3.3 表示を増やす3.4 ウィジェットをタップした際にアプリを起動する4 ...

SwiftGenを使ってみた

1 はじめに2 SwiftGenの特徴2.1 コードジェネレートするリソースを選択することができる2.2 コードジェネレートするのにビルドが必要ない2.3 設定ファイルベースである3 インストール4 ...

swift

月と日を選択するpickerを作る

1 はじめに1.1 前提条件2 サンプル2.1 ピッカーのイメージ2.2 ピッカーのxibファイル2.3 実装したカスタムクラス2.4 呼び出し元のコード3 簡単な解説3.1 MonthAndDayP ...

フォロー

blog-page_side_responsive

2021年3月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

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