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


関連記事

CollectionViewのカスタムレイアウトを作ってみた

1 はじめに2 作成するレイアウト2.1 レイアウト2.2 手順3 prepare( )4 layoutAttributesForItem(at indexPath: IndexPath)5 layo ...

swift

Swift3でSCLAlertViewを使ってみた

1 はじめに2 準備3 実装 はじめに 今回はSwiftでフラットなデザインの アニメーション付きアラートビューが扱える SCLAlertViewを試してみたいと思います。 準備 おなじみCocoaP ...

swift

iOSで画像の任意の場所をぼかし処理する方法

1 はじめに1.1 前提条件2 準備3 実装3.1 ぼかし処理のイメージ画像3.2 サンプルコード4 さいごに はじめに iOSで写真の任意の場所にぼかし処理をしたいケースがありましたので、 iOSで ...

swift

Swift3 コードでの画面遷移

1 はじめに1.1 環境2 performSegue2.1 事前準備2.2 遷移先を示すSegueを作成2.3 遷移させるイベントを作成2.4 画面遷移させる3 prepare3.1 事前準備3.2 ...

swift

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

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

フォロー

blog-page_side_responsive

2021年3月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

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