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]AlamofireでファイルのUploadをしてみる

1 はじめに2 CarthageでAlamofireを導入する2.1 CartFileの作成とライブラリのダウンロード2.2 Xcodeの設定3 Alamofireとは3.1 AlamofireのHT ...

【Swift】ITMS-90726で警告された際の対応

1 はじめに2 警告について3 RXTestについて4 Carthageの設定の確認5 おまけ5.1 Carthage削除6 さいごに7 おすすめ書籍 はじめに こんにちはsuzukiです。最近アプリ ...

iOS14のWidget機能を使ってみた。

1 はじめに2 Xcode 12 betaの入れ方3 WidgetExtensionの追加方法4 デフォルトのコード説明5 Configurationについて6 プロバイダー6.1 snapshot6 ...

【Swift】QuickActionで普段と異なる初期画面を表示する。

1 はじめに2 Quick Actionとは3 実装方法3.1 Quick Actionの追加3.2 タップされた際の動作3.2.1 アプリが起動していない場合3.2.2 アプリが起動している場合4 ...

Swift [unowned self]を[weak self]に修正してみた

1 はじめに2 通信環境の再現3 unowned self4 修正方法5 さいごに6 おすすめ書籍 はじめに こんにちはsuzukiです「SwiftUI」が発表されました。レイアウト作成がとてもしやす ...

フォロー

blog-page_side_responsive

2021年3月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

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