Swiftでのページ遷移!10選の最適な方法

Swiftを使ったページ遷移の方法を徹底解説するイメージSwift
この記事は約26分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Swiftを使用することで、iOSアプリケーションのページ遷移を効果的に実装することができます。

ページ遷移は、アプリ内での画面間の移動を可能にする重要な要素であり、ユーザーエクスペリエンスを大きく左右します。

この記事では、Swiftを使ったページ遷移の具体的な方法を10つ取り上げ、それぞれの方法を初心者から中級者までわかりやすく解説します。

各手法の使い方、注意点、カスタマイズの方法などを超絶詳細に紹介することで、アプリのページ遷移がスムーズに実装できるようになります。

アプリケーション開発において、ページ遷移は必須の技術となっています。

Swiftをマスターすることで、より洗練されたアプリを作成することが可能となります。

●Swiftとページ遷移の基本

アプリケーションのページ遷移は、ユーザーがアプリケーション内での情報や機能にアクセスする際のキーとなります。

Swiftでのページ遷移の基本について学ぶことで、効果的なアプリケーション開発を進めることができます。

○Swiftにおけるページ遷移の役割

アプリケーションは、多くの場合、一つの画面だけでは機能を完絽に表現することはできません。

例えば、リスト画面から詳細画面へ移る、設定画面からメイン画面へ戻るなど、多くの操作がページ遷移を伴います。

Swiftにおけるページ遷移は、これらの画面間の移動をスムーズかつ自然に行うための役割を果たします。

正確にページ遷移を実装することで、ユーザーはアプリを直感的に操作することができ、満足度を高めることができます。

ページ遷移がアプリのユーザビリティを高める重要な要素であることを認識し、それを効果的に実装することが求められます。

○Swiftのページ遷移メカニズム

Swiftでは、主にSegueやViewController、NavigationControllerなどのクラスを使用してページ遷移を実現します。

Segueは、Storyboard上で2つのViewController間の遷移を定義するものです。

このSegueをトリガーとして、実際のページ遷移が行われることになります。

一方、ViewControllerは、アプリケーションの一画面を表すクラスで、ページ遷移の起点や終点として機能します。

ViewController間の遷移は、present()dismiss()といったメソッドを使用してコード上で制御することができます。

NavigationControllerは、ページ遷移におけるスタック構造を提供するクラスです。

複数のViewControllerをスタックのように積み重ね、画面間の遷移をスムーズに行うことが可能になります。

●Swiftでのページ遷移の使い方

Swiftを使ってアプリケーションを開発する際、ページ遷移は避けては通れないテーマとなります。

ページ遷移とは、一つの画面から別の画面へ移る動作のことを指します。

ここでは、ページ遷移の基本的な使い方から、データの受け渡しに至るまでの方法を、具体的なサンプルコードと共に解説します。

○サンプルコード1:基本的なページ遷移

まずは、最も基本的なページ遷移の方法について学びましょう。

Swiftでのページ遷移は、Segueを使用する方法と、コードベースで遷移を制御する方法が主に存在します。

ここでは、Storyboard上でSegueを使用した方法を解説します。

このコードでは、Buttonをタップすることで次の画面に遷移するサンプルを表しています。

この例では、Storyboardに配置したButtonを、次のViewControllerに紐付けて遷移を実現しています。

// ViewController.swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // 何かの初期設定
    }

    // このメソッドは、Buttonがタップされたときに呼び出される
    @IBAction func moveToNextPage(_ sender: UIButton) {
        performSegue(withIdentifier: "moveToNext", sender: self)
    }
}

このコードでのポイントは、performSegue(withIdentifier:sender:)メソッドを使用して、指定したSegueを実行している部分です。

Storyboard上で「moveToNext」というIdentifierを持つSegueを定義している場合、このメソッドによって該当のSegueが実行され、遷移が行われます。

実際に上記のコードを実行すると、Buttonをタップすることで定義したSegueに従い、次のViewControllerへとスムーズに遷移することが確認できます。

○サンプルコード2:遷移先のページでデータを受け取る方法

多くの場合、遷移元のページから遷移先のページへ何らかのデータを渡したい場面が生じます。

ここでは、そのようなデータの受け渡し方法について詳しく解説します。

このコードでは、テキストフィールドに入力された文字列を、次の画面で表示するサンプルを表しています。

この例では、prepare(for:sender:)メソッドをオーバーライドして、遷移先のViewControllerにデータを渡しています。

// ViewController.swift
import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "moveWithData" {
            let nextVC = segue.destination as! SecondViewController
            nextVC.receivedData = textField.text
        }
    }

    @IBAction func moveToNextWithText(_ sender: UIButton) {
        performSegue(withIdentifier: "moveWithData", sender: self)
    }
}

// SecondViewController.swift
import UIKit

class SecondViewController: UIViewController {
    var receivedData: String?

    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        if let data = receivedData {
            label.text = data
        }
    }
}

上記のコードを実行すると、テキストフィールドに入力された文字列が、遷移先のViewControllerのラベルに表示されることが確認できます。

このようにして、遷移元から遷移先へデータを効果的に受け渡すことが可能です。

○サンプルコード3:Modalを使ったページ遷移

Swiftにおけるページ遷移の中で、Modalという方法を用いることで、一つの画面から新しい画面を上からスライドして表示させることができます。

この方法はユーザーに新しいタスクや選択を促す場面で頻繁に使用されます。

このコードではUIViewControllerを使って、モーダル遷移を行っています。

この例では、Buttonをタップすることで新しい画面をモーダルとして表示させています。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func showModal(_ sender: UIButton) {
        // 遷移先のViewControllerをインスタンス化
        let nextVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ModalViewController") as! ModalViewController
        // モーダルで表示
        self.present(nextVC, animated: true, completion: nil)
    }
}

遷移先のViewController「ModalViewController」には、次のように閉じるボタンを実装するとよいでしょう。

import UIKit

class ModalViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func closeModal(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }
}

このコードを実行すると、ボタンをタップすると新しい画面が上からスライドして表示されます。

閉じるボタンをタップすると、再び元の画面に戻ります。

○サンプルコード4:ページ遷移時のアニメーションの追加

ページ遷移にアニメーションを追加することで、ユーザーエクスペリエンスを向上させることができます。

Swiftでは、遷移時のアニメーションを簡単にカスタマイズすることができます。

このコードでは、UIViewのアニメーションメソッドを使って、ページ遷移の際にフェードイン・フェードアウトのアニメーションを追加しています。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func showNextPage(_ sender: UIButton) {
        let nextVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "NextViewController")

        UIView.transition(from: self.view, to: nextVC.view, duration: 0.5, options: .transitionCrossDissolve, completion: { _ in
            self.present(nextVC, animated: false, completion: nil)
        })
    }
}

このコードを実行すると、次のページへ遷移する際に、フェードイン・フェードアウトのアニメーションが適用されます。

○サンプルコード5:Navigation Controllerを使ったページ遷移

Navigation Controllerは、画面遷移の際にナビゲーションバーを提供するもので、複数の画面間の遷移を管理するのに適しています。

このコードでは、Navigation Controllerを使って、ページ遷移を管理しています。

この例では、TableViewのセルをタップすることで詳細ページに遷移しています。

import UIKit

class ListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let detailVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
        navigationController?.pushViewController(detailVC, animated: true)
    }
}

このコードを実行すると、TableViewのセルをタップすると詳細ページに遷移します。

また、ナビゲーションバーには「戻る」ボタンが自動的に表示され、前の画面に戻ることができます。

●Swiftでのページ遷移の応用例

Swiftを用いて、より複雑なページ遷移の実装を検討している方向けに、応用的なページ遷移の例を紹介します。

基本的なページ遷移の方法を既に理解している前提で、さらに高度なテクニックを学ぶことができます。

○サンプルコード6:Tab Bar Controllerを使った遷移

Tab Bar Controllerは、アプリの下部にタブを配置し、それぞれのタブをタップすることで異なる画面に遷移するためのUI部品です。

特に多くの機能やカテゴリを持つアプリで利用されることが多いです。

import UIKit

class ViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let firstVC = UIViewController()
        firstVC.title = "First Tab"
        firstVC.view.backgroundColor = .red

        let secondVC = UIViewController()
        secondVC.title = "Second Tab"
        secondVC.view.backgroundColor = .blue

        self.setViewControllers([firstVC, secondVC], animated: false)
    }
}

このコードでは、UITabBarControllerを継承したViewControllerクラスを作成しています。

この例では、赤い背景の「First Tab」と青い背景の「Second Tab」という2つのタブを持つタブバーを作成しています。

実装の流れとしては、まず各ViewControllerを初期化し、それぞれのタイトルや背景色を設定します。

そして、setViewControllersメソッドを使って、これらのViewControllerをタブバーコントローラーに追加しています。

実行後の画面で確認すると、下部に「First Tab」と「Second Tab」という2つのタブが表示され、タップすることで適切な画面に切り替わることがわかります。

○サンプルコード7:Segueを使わずにコードベースでの遷移

StoryboardのSegueを使わずに、プログラムのコードだけでページ遷移を実装する方法もあります。

コードでの遷移は、動的に画面遷移を制御したい場合や、Storyboardを使用しないアーキテクチャを取る場合に便利です。

import UIKit

class MainViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(frame: CGRect(x: 100, y: 100, width: 200, height: 50))
        button.setTitle("Go to Next", for: .normal)
        button.addTarget(self, action: #selector(moveToNext), for: .touchUpInside)
        self.view.addSubview(button)
    }

    @objc func moveToNext() {
        let nextVC = NextViewController()
        self.present(nextVC, animated: true, completion: nil)
    }
}

class NextViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .green
    }
}

このコードでは、ボタンを配置したMainViewControllerと、遷移先のNextViewControllerの2つのクラスを作成しています。

MainViewControllerに配置されたボタンをタップすると、moveToNextメソッドが呼び出され、presentメソッドによってNextViewControllerが表示される仕組みです。

実行後の画面を確認すると、ボタンをタップすると緑色の背景を持つNextViewControllerに遷移することが確認できます。

○サンプルコード8:ページ遷移と共にデータを渡す方法

画面間でのデータの受け渡しは、ページ遷移の際に非常に重要なテクニックの一つです。

下記のサンプルでは、一つの画面で入力されたテキストを次の画面に表示しています。

import UIKit

class InputViewController: UIViewController {

    let textField = UITextField(frame: CGRect(x: 50, y: 100, width: 200, height: 50))
    let button = UIButton(frame: CGRect(x: 100, y: 200, width: 200, height: 50))

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.borderStyle = .roundedRect
        self.view.addSubview(textField)

        button.setTitle("Send Data", for: .normal)
        button.addTarget(self, action: #selector(sendData), for: .touchUpInside)
        self.view.addSubview(button)
    }

    @objc func sendData() {
        let resultVC = ResultViewController()
        resultVC.receivedText = textField.text
        self.present(resultVC, animated: true, completion: nil)
    }
}

class ResultViewController: UIViewController {

    var receivedText: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel(frame: CGRect(x: 50, y: 100, width: 200, height: 50))
        label.text = receivedText
        self.view.addSubview(label)
    }
}

このコードでは、テキストフィールドとボタンを持つInputViewControllerと、受け取ったデータを表示するResultViewControllerの2つのクラスを作成しています。

InputViewControllerのボタンをタップすると、sendDataメソッドが呼び出され、テキストフィールドの内容をResultViewControllerに渡して遷移します。

実行後の画面を見ると、テキストフィールドに入力した文字列をボタンをタップすることで、ResultViewControllerのラベルに表示されることが確認できます。

○サンプルコード9:複数の遷移元・遷移先を持つページ遷移

アプリを開発していると、1つの画面から複数の異なる画面に遷移したい、または複数の画面から1つの画面に遷移したいというケースが生じることがよくあります。

このような複数の遷移元・遷移先を持つページ遷移を実現するための方法について見ていきましょう。

// FirstViewController.swift
import UIKit

class FirstViewController: UIViewController {

    @IBAction func moveToSecond(_ sender: UIButton) {
        performSegue(withIdentifier: "toSecond", sender: nil)
    }

    @IBAction func moveToThird(_ sender: UIButton) {
        performSegue(withIdentifier: "toThird", sender: nil)
    }
}

// SecondViewController.swift
import UIKit

class SecondViewController: UIViewController {
}

// ThirdViewController.swift
import UIKit

class ThirdViewController: UIViewController {
}

このコードではFirstViewControllerから、SecondViewControllerThirdViewControllerの2つの遷移先に移動するためのコードを表しています。

この例では、2つのボタンアクションを使用して、それぞれの遷移先に移動しています。

○サンプルコード10:ページ遷移をキャンセルする方法

アプリの使いやすさを考えると、特定の条件下でページの遷移をキャンセルしたい場面が出てきます。

例えば、フォームの入力が不完全な場合や、ユーザーに再確認を求める場面などです。

ここでは、Swiftでページ遷移をキャンセルする方法を詳しく見ていきます。

// ViewController.swift
import UIKit

class ViewController: UIViewController {

    var canMoveToNextPage: Bool = false

    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        return canMoveToNextPage
    }

    @IBAction func toggleMovePermission(_ sender: UIButton) {
        canMoveToNextPage.toggle()
    }
}

このコードではshouldPerformSegueメソッドを使用して、遷移をキャンセルするかどうかの判断を行っています。

この例では、canMoveToNextPageの真偽値に応じて遷移の許可・キャンセルを制御しています。

●Swiftでのページ遷移の注意点と対処法

Swiftを使用してアプリケーションのページ遷移を実装する際、多くの開発者が直面する可能性のある一般的な問題やトラブル、そしてそれらの解決策について詳しく説明します。

正しくページ遷移を実装するためには、これらの注意点を理解し、適切な対処法を取ることが重要です。

○画面遷移に関する共通のトラブルとその解決策

□画面遷移がうまくいかない

画面遷移が期待通りに動作しない場合、最も一般的な原因はSegueの識別子が正しく設定されていない、または全く設定されていないことです。

Segueの識別子は、Storyboard上で遷移の起点となるボタンやセルなどを右クリックし、DestinationとなるViewControllerにドラッグ&ドロップすることで設定できます。

解決策として、Storyboard上で遷移元と遷移先の関連付けを確認し、Segueの識別子が正しく設定されているか確認してください。

□遷移先のViewControllerが表示されない

これは、遷移先のViewControllerのLifecycleメソッド(例: viewDidLoad, viewWillAppearなど)に問題がある可能性が高いです。

解決策として、遷移先のViewControllerのLifecycleメソッドにブレークポイントを設定し、正しく呼び出されているかデバッグしてください。

□遷移時にアプリがクラッシュする

このような場合、原因として考えられるのは遷移先のViewControllerの初期化に問題がある、または遷移時に渡すべきデータが渡されていないなどが考えられます。

解決策として、エラーログを確認し、具体的なエラーメッセージを元に問題の原因を特定してください。

○データの受け渡し時の注意点

ページ遷移時にデータの受け渡しを行う際には、特に以下の注意点が挙げられます。

□遷移先のViewControllerでデータを受け取る変数が正しく設定されていない

遷移先のViewControllerにデータを受け取るための変数を定義する際、その変数は外部からアクセス可能である必要があります。

この変数がprivate属性である場合、遷移元から値を渡すことができません。

解決策として、遷移先のViewControllerでデータを受け取る変数のアクセスレベルを確認し、必要に応じて変更してください。

□遷移先でのデータの型が遷移元と一致していない

遷移元から遷移先にデータを渡す際、そのデータの型が一致していないとランタイムエラーが発生し、アプリがクラッシュする可能性があります。

解決策として、遷移元と遷移先のデータ型を確認し、必要に応じて型を一致させるように修正してください。

□遷移時にデータがnilである

もし遷移時に渡すべきデータがnilである場合、これが原因でアプリがクラッシュする可能性があります。

解決策として、データがnilでないことを確認するためのnilチェックを追加し、適切なデフォルト値を設定するか、nilの場合の処理を追加してください。

●Swiftでのページ遷移のカスタマイズ方法

Swiftにおいてアプリケーション開発を行う際、ページ間の遷移は必須の機能となります。

ページ遷移の実装方法やその際のアニメーション、スタイルの変更方法など、カスタマイズの方法について詳細に解説していきます。

○ページ遷移のアニメーションをカスタマイズする方法

アプリケーションでページ遷移を行う際、遷移のアニメーションはユーザー体験を大きく左右します。

Swiftでは、ページ遷移のアニメーションをカスタマイズすることができるので、アプリの特性やデザインに合わせて調整することができます。

このコードでは、カスタムアニメーションを用いてページ遷移を行うコードを表しています。

この例では、UIViewtransitionメソッドを利用して、遷移のアニメーションをカスタマイズしています。

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var containerView: UIView!

    @IBAction func changeContent(_ sender: UIButton) {
        let newView = UIView(frame: containerView.bounds)
        newView.backgroundColor = .random()

        UIView.transition(with: containerView, duration: 0.5, options: .transitionFlipFromRight, animations: {
            self.containerView.addSubview(newView)
        }, completion: nil)
    }
}

このコードでは、ボタンをクリックするとcontainerView内に新しいUIViewがフリップアニメーションで追加されることになります。

アニメーションの種類は、optionsの部分で指定することができます。

このコードを実行すると、ボタンをクリックすると新しい色のビューがフリップアニメーションで表示されます。

このようにして、ページの遷移時にアニメーションをカスタマイズできます。

○画面遷移のスタイルや表示方法を変更するテクニック

ページ遷移を行う際のスタイルや表示方法も、Swiftではカスタマイズが可能です。

例えば、モーダル表示のスタイルや、ナビゲーションバーの表示・非表示、遷移先のページのステータスバーのスタイルなど、細かい部分まで調整することができます。

このコードでは、モーダル表示を行いつつ、遷移先のページでナビゲーションバーを非表示にするコードを表しています。

この例では、UINavigationControllerを用いて、遷移先のページでナビゲーションバーの表示を制御しています。

import UIKit

class FirstViewController: UIViewController {

    @IBAction func moveToSecondVC(_ sender: UIButton) {
        let secondVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
        let navController = UINavigationController(rootViewController: secondVC)
        navController.setNavigationBarHidden(true, animated: false)
        self.present(navController, animated: true, completion: nil)
    }
}

このコードを利用すると、ボタンをクリックするとモーダルで遷移先のページが表示されます。

そして、遷移先のページではナビゲーションバーが非表示となります。

まとめ

Swiftにおけるページ遷移は、アプリケーションのユーザビリティやユーザーエクスペリエンスを向上させる上で極めて重要な要素となっています。

本記事では、Swiftを使用してのページ遷移の基本から、カスタマイズ方法、アニメーションの変更方法、画面遷移のスタイルや表示方法の調整に関するテクニックなど、幅広い知識を網羅的に解説しました。

アプリ開発の中でページ遷移は頻繁に行われる操作であり、それをスムーズかつ魅力的に行うことで、アプリの利用者にとっての満足度を高めることができます。

特に、Swiftのような多機能なプログラミング言語を使用している場合、様々なカスタマイズや最適化が可能となっていますので、その特性を最大限に活かすことが求められます。

今後アプリを開発する際には、本記事で紹介したページ遷移の技術や知識を活用して、より使いやすく、魅力的なアプリを作成してみてください。

そして、Swiftの持つ豊富な機能や可能性を、アプリのさらなる向上のために利用してください。