Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SwiftUIのハマりどころとその回避策/ iOSDC_otsuka

Recruit
September 12, 2022

SwiftUIのハマりどころとその回避策/ iOSDC_otsuka

2022/09/11_iOSDC Japan 2022での、大塚の講演資料になります

Recruit

September 12, 2022
Tweet

More Decks by Recruit

Other Decks in Technology

Transcript

  1. 3 ⾃⼰紹介 © Recruit Co., Ltd. All Rights Reserved ⼤塚

    悠貴 (@moguaiyuki) 所属 経歴 株式会社 リクルート 2020年 4⽉ 株式会社リクルート新卒⼊社 2020年 7⽉ ゼクシィiOS開発 2020年 10⽉ 新規事業プロダクトオーナー 2021年 10⽉ iOS開発
  2. Airインボイスとは © Recruit Co., Ltd. All Rights Reserved 6 リクルートの事業内容について(主なサービス)

    4 選択・意思決定を⽀援する情報サービスを提供し、 「まだ、ここにない、出会い。より速く、シンプルに、もっと近くに」を実現する マッチング&ソリューションSBU HRテクノロジーSBU ⼈材派遣SBU 国内派遣 海外派遣
  3. 11 SwiftUI採⽤の背景とその効果 © Recruit Co., Ltd. All Rights Reserved •

    新規開発 (既存コードなし) • SwiftUIが安定してきたiOS14以上をサポート • 社内でもスタディサプリが既にSwiftUI採⽤済み SwiftUIの採⽤背景 • UIの実装速度が向上 • レイアウトの記述がシンプル • コンポーネントの再利⽤が容易 • Previewで⾼速にUI変更確認 • Storyboardやxibと⽐較してレビューが容易 …など、メリットを沢⼭感じることができた SwiftUI採⽤による効果
  4. ハマりどころとその回避策 © Recruit Co., Ltd. All Rights Reserved 12 ※本スライドはiOS14,

    15をサポート対象とする前提のコードとなっています。
  5. 15 SwiftUIでの基本的なpush遷移 © Recruit Co., Ltd. All Rights Reserved ユーザーがNavigationLinkを

    タップすることで遷移 Deep linkのようなプログラム的に遷移する要件には使えない
  6. 16 プログラムで遷移を制御する © Recruit Co., Ltd. All Rights Reserved ※iOS16以上ではinit(value:

    label:)を使⽤ 空(EmptyView)のNavigationLinkを Backgroundに仕込む destinationの値が”pageA”になった時 遷移を発⽕する
  7. 17 アプリのどこからでも遷移を制御できるようにする © Recruit Co., Ltd. All Rights Reserved @EnvironmentObjectにViewRouterを格納し、

    アプリのどこからでも遷移を制御できるようにする 各画⾯の画⾯遷移を制御するViewRouterをまとめた ObservableObject 遷移先を定義 viewRouter.firstPageViewRouter.destinationの 値を変更することで遷移を発⽕する
  8. 18 DeepLinkを実装する © Recruit Co., Ltd. All Rights Reserved .onOpenURLでURLスキームを

    受け取り、ViewRouterを⽤いて 画⾯遷移を発⽕する
  9. 22 iOS14&NavigationLink 2つのみの場合挙動が不安定 © Recruit Co., Ltd. All Rights Reserved

    ページ3まで遷移すると 勝⼿にページ1に戻る ページ1 ページ2 ページ3 遷移 遷移 ※デモ動画
  10. 23 iOS14系&NavigationLink 2つのみの場合挙動が不安定 © Recruit Co., Ltd. All Rights Reserved

    遷移直後に勝⼿に戻る問題の報告 NavigationLinkが 2つの場合のみ発⽣ https://developer.apple.com/forums/thread/677333 https://forums.swift.org/t/14-5-beta3-navigationlink-unexpected-pop/45279
  11. 30 回避策? © Recruit Co., Ltd. All Rights Reserved この遷移を使う時は必ずpageAIdがnon-null

    強制アンラップしてみる︖ Viewを⽣成した時点ではnullなのでもちろんダメ
  12. 39 回避策 © Recruit Co., Ltd. All Rights Reserved 1つの.alertの中で

    複数パターン出し分ける アラートのパターンを定義しておく
  13. 44 このコードのどこに問題があるでしょうか︖ © Recruit Co., Ltd. All Rights Reserved 1つのViewに対して

    2つの.fullScreenCoverを 利⽤していることが問題 ※iOS14.5以上は問題ない
  14. 49 苦⾁の回避策 © Recruit Co., Ltd. All Rights Reserved iOS14.5未満かどうかで

    実装を変更 条件によってmodifierを適⽤する modifier
  15. 54 NavigationViewに対してカスタムダイアログを表⽰すれば 実現可能だが、ダイアログ等は各タブや遷移先で管理したい © Recruit Co., Ltd. All Rights Reserved

    NavigationViewに対して カスタムダイアログを宣⾔する TabViewA内でshowDialog変数を Trueにしてダイアログを表⽰する
  16. 57 UIWindowを利⽤することで、カスタムダイアログ の上にさらにチュートリアルを出すことも © Recruit Co., Ltd. All Rights Reserved

    チュートリアルとカスタムダイアログを別々の Windowで管理しているため、簡単に実現可能
  17. 59 まとめ © Recruit Co., Ltd. All Rights Reserved ①iOS14系のNavigationLinkの挙動には気をつける

    ②If let でNavigationLinkは⽣成しない ③.alertは1つのViewに対して1つのみ ④.fullScreenCoverはiOS14.5未満に対しては1つのViewに1つのみ ⑤全画⾯にまたがるカスタムダイアログ等はUIWindowの活⽤も⼀つの選択肢 ハマりポイント
  18. 60 まとめ © Recruit Co., Ltd. All Rights Reserved UIの実装速度が向上

    l レイアウトの記述がシンプル l コンポーネントの再利⽤が容易 l Previewで⾼速にUI変更確認 l Storyboardやxibと⽐較してレビューが容易 ….など、メリットを沢⼭感じることができた SwiftUIはハマりポイントもあったが、総じて採⽤してよかった 採⽤してよかった理由