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】Xcode13XCTestの新機能、繰り返し実行で遊んでみた。

1 はじめに2 XCTestについて3 繰り返しのテストについて4 実際に使ってみる5 テストコードについて6 テストの設定7 さいごに8 おすすめ書籍 はじめに こんにちは、suzukiです。とうと ...

swift

[Swift]タブの切り替え時にアニメーションが簡単に実装できる「TransitionableTab」

1 はじめに2 準備3 実装4 さいごに はじめに こんにちは、nukkyです。 今回は、UITabBarControllerの切り替え時にアニメーションを実装できるライブラリ「Transitiona ...

swift

Swift3 StoryBoard上でUIButtonやUILabel、UIViewのcornerを変更する

1 はじめに1.1 前提条件2 StoryBoardの準備3 カスタムクラスの作成3.1 class ~について3.2 @IBDesignableを記述すると3.2.1 Live Renderingと ...

[Swift]カメラデバイスで使用できる解像度の中で、最大のサイズを設定する

1 はじめに2 フォーマット一覧の取得3 フォーマットを設定する4 カメラデバイスで使用できる解像度の中で、最大のサイズを設定する5 さいごに6 おすすめ書籍 はじめに iOSでカメラの映像を画面に表 ...

swift

Swift ChartsライブラリとCryptowatchAPIでローソク足を描画してみる。

1 はじめに2 CryptoWatchについて2.1 OHLC3 リクエスト方法3.1 CryptoWatchのAPI3.2 Swiftでの実装方法4 さいごに5 おすすめ書籍 はじめに こんにちは鈴 ...

フォロー

blog-page_side_responsive

2021年3月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

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