SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

iOS16の新機能に触れてみよう

iOS16/SwiftUI 4の新機能の使い方──Chartsフレームワーク、Navigation、Advanced controls

iOS16の新機能に触れてみよう 第1回


  • X ポスト
  • このエントリーをはてなブックマークに追加

画面遷移とウィンドウの扱いがよりわかりやすく──Navigation and window

 画面遷移とウィンドウの扱いについて仕様が更新されました。主要な変更点について、Stacks/Split View/Scenesの3つでまとめられています。

SwiftUI 4での主要な変更点
分類 概要
Stacks 画面遷移の方法
Split View 画面分割の方法
Scenes ウィンドウの扱い

 それぞれの項目について簡単なサンプルコードとともに紹介します。

Stacks

 画面遷移の方法が変更されました。これまで利用されていたNavigationViewはiOS 16で廃止されます。画面遷移では、NavigationStackを利用します。前節のサンプルデータを使ってNavigationStackの例を挙げます。

[リスト3]NavigationStackSample/ContentView.swift抜粋
struct ContentView: View {
    var body: some View {
        NavigationStack {    // (1)  
            List(MonthAmount.examples) { data in  // サンプルデータをリスト表示
                NavigationLink(value: data) {      // (2)
                    Text(data.month)   // 月のリストを表示
                }
            }
            .navigationDestination(for: MonthAmount.self) { data in       // (3)
                DetailView(data: data)   // 遷移先のView
            }
        }
    }
}

// 遷移先のView
struct DetailView: View {
    var data: MonthAmount

    var body: some View {
        VStack {   // サンプルデータのmonthとamoutを表示
            Text(data.month).font(.title)
            Text("\(data.amount)")
        }
        .padding()
    }
}
Stacksの例
Stacksの例

 画面遷移を利用する部分は、NavigationStackで定義します(1)。画面遷移のリンクは、これまで通りNavigationLinkを利用して作成します(2)。画面遷移先はNavigationStackのnavigationDestinationメソッドで定義します(3)。NavigationDestinationメソッドには、NavigationLinkの引数となるオブジェクトが渡されます。サンプルでは、MonthAmountオブジェクトが渡されますので、このオブジェクトに対して画面遷移を行うように定義します。

Split View

 Master-Detailの画面構成のように、選択された項目の詳細を表示するビューとしてNavigationSplitViewが定義されました。NavigationSplitViewを利用すると、2列または3列に渡る画面を作成することができます。前項までに作成したサンプルデータと詳細画面を利用してNavigationSplitViewの簡単な例を挙げます。

[リスト4]NavigationSplitSample/ContentView.swift抜粋
struct ContentView: View {
    @State private var data: [MonthAmount] = MonthAmount.examples
    @State private var selectedData: MonthAmount?
    @State private var path = NavigationPath()   // 詳細画面へのパス
    @State private var visibility: NavigationSplitViewVisibility = .automatic  // 自動的にメニューを表示するか
    
    var body: some View {
        NavigationSplitView(columnVisibility: $visibility, sidebar: { // (1) メニュー部分を定義
            List(data, selection: $selectedData) { data in   // 表示するリスト
               NavigationLink(value: data, label: {
                   Text(data.month)
               })
            }
            .listStyle(.sidebar)
            .navigationTitle("MonthAmount")
        }, detail: { // (2)  詳細を定義
            NavigationStack(path: $path) {  // メニュー選択時に詳細画面を表示
               if let data = selectedData {
                  DetailView(data: data)
               } else {
                   Text("選択してください")
               }
            }
        })
    }
}
Splits Viewsの例
Split Viewの例

 NavigationSplitViewを利用する際には、最初のブロックでメニューに当たる部分(1)、detailブロックで詳細を表示する部分(2)を定義します。この時に、引数columnVisibilityで、画面に応じてメニューを表示するかを指定できます。サンプルでは、画面の向きに応じて自動的にメニューを表示する「.automatic」を指定しています。メニューが表示されない場合でも、ヘッダの左上に表示されるボタンでメニューを開閉できます。

メニューの開閉
メニューの開閉

 メニューはNavigationLink構造体で定義し、選択された項目を詳細画面に表示します。項目の選択時に、画面遷移の動作を表すNavigationPathオブジェクトが渡されますので、前項のNavigationStackを用いて詳細画面を表示します。

 NavigationSplitViewでカラムを選択して、選択に応じた画面を表示するときにも、NavigationStackを用いる点に気をつけてください。

Scenes

 iアプリの状態に応じて補足的にウィンドウを表示する機能が追加されました。アプリの起動中にはメニューバーからもウィンドウを表示する機能も実装されました。

 こちらはmacOS向けの機能であり、本連載の趣旨を超えてしまいますので、What's new in SwiftUIの動画の9:55~で確認してください。

次のページ
より便利になった入出力機能──Advanced controls

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
iOS16の新機能に触れてみよう連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/16580 2022/11/15 14:48

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング